1 2 3 4 5 6 int main () { cout << "Hello World" ; cout << "I am learning C++" << endl; return 0 ; }
数据类型
缩写
类型
备注
int
整形
bool
布尔型
char
字符型
float
浮点型
double
双浮点型
void
无类型
wchar_t
宽字符型
string
字符串
不是标准类型,需要引用头文件 <string>
输入、输出
C语言和C++输入输出总结
标准输入流
C语言
C语言使用标准输入输出函数,需要包含头文件<stdio.h>
。在 C++ 中,只要包含头文件<iostream>
,就完全可以使用这些 C 中的输入输出函数。
输入流
stdin
是一个文件描述符(Linux)或句柄(Windows),它在 C 程序启动时就被默认分配好。在 Linux 中一切皆文件,stdin
也相当于一个可读文件,它对应着键盘设备的输入。因为它不断地被输入,又不断地被读取,像流水一样,因此通常称作输入流。
stdin
是一种行缓冲I/O。当在键盘上键入字符时,它们首先被存放在键盘设备自身的缓存中(属于键盘硬件设备的一部分)。只有输入换行符时,操作系统才会进行同步,将键盘缓存中的数据读入到stdin
的输入缓冲区(存在于内存中)。所有从stdin
读取数据的输入流,都是从内存中的输入缓冲区读入数据。当输入缓冲区为空时,函数将被阻塞。
若无特殊说明,以下所有的 缓冲区 均是指内存中的stdin
输入缓冲区。用户程序中自定义的buffer
数组、str
数组等,将称作“数组”、“变量”,以免产生混淆。
scanf()
按照特定格式从stdin读取输入。
1 2 3 char str[100 ];int a;scanf ("%s %d" , str, &a);
传入的一定要是地址。特别的,对于上面例子里的char str[]
,这是一个字符串数组,数组名 str
或者指针 &str
都可以代表其地址。
对空白字符的处理:
缓冲区开头:丢弃空白字符(包括空格、Tab、换行符),直到第一个非空白字符才认为是第一个数据的开始。
缓冲区中间:开始读取第一个数据后,一旦遇到空白字符(非换行符), 就认为读取完毕一次。遇到的空白字符残留在缓冲区,直到下一次被读取或刷新。例如输入字符串this is test,则会被认为是3个字符串。
缓冲区末尾:按下回车键时,换行符\n残留在缓冲区。换行符之前的空格可以认为是中间的空白字符,处理同上。
C++
cin
1 2 3 4 int a;char str[20 ];cin >> a; cin >> str;
属于命名空间 std
遇到空白字符停止读取,空白字符(包括换行符)残留在缓冲区
cin.get()
读取一个或指定长度的字符,包括空白字符,可指定分隔符类型,分隔符默认是(换行符)残留在缓冲区。
1 2 3 4 char a;char str[20 ];a = cin.get (); cin.get (str, sizeof (str), '\n' );
cin.getline()
读取指定长度的字符,包括空白字符
cin.getline()
与cin.get()
指定读取长度时的用法几乎一样。区别在于,如果输入的字符个数大于指定的最大长度n-1(不含终止符),cin.get()
会使余下字符残留在缓冲区,等待下次读取;而cin.getline()
会给输入流设为 Fail 状态,在主动恢复之前,无法再进行正常输入。
getline()
不是标准输入流iostream
的函数,而是字符串流的函数,使用时需要包含头文件<string>
如果使 用getline()
读取标准输入流的数据,需要显式指定输入流。
1 2 string str; getline (cin, str);
getline()
会读取所有空白字符,且缓冲区末尾的换行符会被丢弃,不残留也不写到字符串结尾。同时,由于string对象的空间是动态分配的,所以会一次性将缓冲区读完,不存在读不完残留在缓冲区的问题。
需要注意的是,假如缓冲区开头就是换行符(比如可能是上一次cin残留的),则getline()会直接读取到空字符串并结束,不会给键盘输入的机会。所以这种情况下要注意先清除开头的换行符。
总结
C语言可使用
scanf()
,读取不包括空格和终止符(默认换行符)
fgets()
C++中可使用
cin >>
类似于scanf()
,是std
中的
cin.get()
读取单个或指定长度字符,读取包括空格,不包括终止符(默认换行符)
cin.getline()
读取指定长度的字符,读取包括空格,不包括终止符,且读取完成后会把输入流设定为Fail状态。可用于char str[100]
这样的char
类型的字符串整行输入
getline
读取所有空白字符(整个缓存区),不包括换行符,读取完后无残留。是字符串流的函数,只能读取string
对象,使用时需要包含头文件<stirng>
。可用于string s
这样的的string
类型的字符串的整行输入
字符串
一个带空格的句子的存储办法可以是str[100]
这样的指定长度的字符串(C语言风格)
另一种办法是用封装好的字符串类string
(C++风格),动态分配长度
标准输出流
C语言
C++
运算符
常量与变量
变量命名的一般规则是:
名称可以包含字母、数字和下划线
名称必须以字母或下划线(_
)开头
名称要区分大小写,myVar和myvar是不同的变量
名称不能包含空格或特殊字符,如!
、#
、%
等。
保留字(如C++关键字,如int
不能作为名称使用)
1 2 3 4 5 6 7 8 int main () { int x; cout << "Type a number: " ; cin >> x; cout << "Your number is: " << x; return 0 ; }
字符串
字符串
一个带空格的句子的存储办法可以是str[100]
这样的指定长度的字符串(C语言风格)
另一种办法是用封装好的字符串类string
(C++风格),动态分配长度
程序流程结构
选择语句
循环语句
跳转语句
数组
string cars[4] = {"BYD", "Ford", "Mazda", "BWM"}
下标从0开始
指针
取地址运算符 &
&
是一元运算符,返回操作数的内存地址。例如,如果 var
是一个整型变量,则 &var
是它的地址。该运算符与其他一元运算符具有相同的优先级,在运算时它是从右向左顺序进行的。
您可以把 & 运算符读作"取地址运算符 ",这意味着,&var
读作"var 的地址"。
间接寻址运算符 *
第二个运算符是间接寻址运算符 *
,它是 &
运算符的补充。*
是一元运算符,返回操作数所指定地址的变量的值。
请看下面的实例,理解这两种运算符的用法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <iostream> using namespace std;int main () { string food = "Pizza" ; string &meal = food; cout << food << "\n" ; cout << meal << "\n" ; cout << &food; return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <iostream> using namespace std;int main () { string food = "Pizza" ; string *ptr = &food; cout << food << "\n" ; cout << &food << "\n" ; cout << ptr << "\n" ; cout << &ptr << "\n" ; *ptr = "Hamburger" ; cout << *ptr << "\n" ; return 0 ; }
函数
函数的引用
函数的调用便于功能的复用,例如可以编写一个打印函数,通过传参使之实现打印功能
1 2 3 4 5 6 7 8 9 10 11 12 13 #include <iostream> using namespace std;void myFuction () { cout << "666" ; } int main () { myFuction (); return 0 ; }
函数的声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <iostream> using namespace std;void myFuction () ;\\主函数放在最后,也就是其他函数需要提前声明 int main () { myFuction (); return 0 ; } void myFuction () { cout << "666" ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <iostream> using namespace std;void myFuction (string fname = "Jack" ) { cout << fname << "Refsnes\n" ; } int main () { myFuction ("Liam" ); myFuction ("Jenny" ); myFuction ("Anja" ); myFuction (); return 0 ; }
函数亦可以设置返回值,调用函数的最终结果就是获得了返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <iostream> using namespace std;void myFuction (int x, int y) { return x + y; } int main () { cout << myFuction (5 , 3 ); int z = myFuction (5 , 3 ); cout << z << endl; return 0 ; }
交换函数的实现
传递值进函数内交换
传递指针进函数内交换
用引用也就是别名交换
用定义宏的方式交换
自带的交换函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 template <class T>void swap1 (T *p1,T *p2) { T temp = *p1; *p1 = *p2; *p2 = temp; } int main () { int a=10 ; int b=-23 ; swap1 (&a,&b); cout<<a<<"," <<b; return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 template <class T>void swaps (T &a,T &b) { T temp = a; a = b; b = temp; } int main () { int a=-2 ; int b=16 ; swaps (a,b); cout<<a<<endl<<b; return 0 ; }
1 2 3 4 5 6 7 8 9 #define SWAP2(a,b,temp)((temp)=(a),(a)=(b),(b)=(temp)) int main () { int a=15 ; int b=-56 int temp; SWAP2 (a,b,temp); cout<<a<<";" <<b<<endl; }
1 2 3 4 5 6 7 8 int main () { int a,b; a = 100 ; b = -200 ; std::swap (a,b); cout<<a<<endl<<b; }
函数重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include <iostream> using namespace std;int myFuction (int x, int y) { return x + y; } double myFuction (int x, int y) { return x - y; } int main () { cout << "Int: " << myFuction (5 , 3 ); cout << "Double: " << myFuction (5 , 3 ); return 0 ; }
结构体
类和多态
类时对象的模板,对象是类的一个实例。当某个对象被创建的时候,他就继承了类里的所有特性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <iostream> #include <string> using namespace std;class Car { public : string brand; string model; int year; }; int main () { Car carObj1; carObj1.brand = "BWM" ; carObj1.model = "BWM" ; carObj1.year = 1997 ; cout << carObj1.brand << " " << carObj1.model << " " << carObj1.year; return 0 ; }
类里面的函数叫做方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include <iostream> #include <string> using namespace std;class Car { public : int speed (int maxSpeed) ; void myMethod () { cout << "Hello World!" ; } }; int Car::speed (int maxSpeed) { return maxSpeed; } int main () { Car myObj; cout << myObj.speed (200 ) << endl; myObj.myMethod (); return 0 ; }
构造函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include <iostream> #include <string> using namespace std;class Car { public : string brand; string model; int year; Car (string x, string y, int z); }; Car::Car (string x, string y, int z) { brand = x; model = y; year = z; } int main () { Car carObj1 ("BWM" , "XS" , 1999 ) ; cout << carObj1.brand << " " << carObj1.model << " " << carObj1.year; return 0 ; }
访问的权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <iostream> using namespace std;class MyClass { int b; public : int x; int y; private : int a; }; int main () { MyClass myObj; myObj.x = 25 ; myObj.a = 50 ; myObj.b = 11 ; return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <iostream> using namespace std;class Employee { private : int salary; public : void setSalary (int s) { salary = s; } int getSalary () { return salary; } }; int main () { Employee myObj; myObj.setSalary (5000 ); cout << myObj.getSalary (); }
类的继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <iostream> using namespace std;class Vehicle { public : string brand = "Ford" ; void honk () { cout << "Tuut, tuut! \n" ; } }; class Car : public Vehicle{ public : string model = "Mustang" ; }; int main () { Car myCar; myCar.honk (); cout << myCar.brand + " " + myCar.model; return 0 ; }
子类可以继承多个父类的特性(多继承)。
父类里的prtected
只能被子类访问
多态性
继承让子类能从父类中继承属性和方法,多态性使用这些方法来执行不同的任务,即可以让我们用不同的方法执行一个单一的动作。
例如,有一个叫Animal
的基类,他有一个叫做animalSound()
的方法。动物的派生类可以是牛马猫狗,而且他们也可以有自己动物声音的不同实现(牛叫、马叫、猫叫、狗叫等)。方法名称相同,但调用的都是自己的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #include <iostream> using namespace std;class Animal { public : void animalSound () { cout << "The animal makes a sound" ; } }; class Pig : public Animal{ public : void animalSound () { cout << "The pig says: wee, wee \n" ; } }; class Dog : public Animal{ public : void animalSound () { cout << "The pig says: bow, bow \n" ; } }; int main () { Animal myAnimal; Pig myPig; Dog myDog; myAnimal.animalSound (); myDog.animalSound (); myPig.animalSound (); return 0 ; }
文件读写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <iostream> #include <fstream> using namespace std;int main () { ofstream MyFile ("filename.txt" ) ; MyFile << "Flies can be tricky, but it is fun enough!" ; MyFile.close (); string myText; ifstream MyReadFile ("filename.txt" ) ; while (getline (MyReadFile, myText)) { cout << myText; } MyReadFile.close (); }
异常处理