【C/C++】C++基础重盲点拾穗
1. 变量的初始化有两种方法:
int a = 3; int a(3);
2. string类型:
string初始化两种:
string mystr = “good man!”; string mystr(“good man!”);
int str_len = mystr.length();
string可以重新赋值:
mystr = “good woman!”;
3. 声明常量:
通过使用const前缀,你可以定义指定类型的常量,就像定义一个变量一样:
const int width = 100; const char tab = '\t'; const zip = 12440;
如果没有指定类型(如上面最后例子中最后一行),编译器会假设常量为整型int。
4. C++运算符的优先级:
优先级 |
操作符Operator |
说明 |
结合方向 |
1 |
:: |
范围 |
从左到右 |
2 |
() [] . -> ++ -- dynamic_cast static_cast reinterpret_cast const_cast typeid |
后缀 |
从左到右 |
3 |
++ -- ~ ! sizeof new delete |
一元(前缀) |
从右到左 |
* & |
指针和取地址 |
||
+ - |
一元符号 |
||
4 |
(type) |
类型转换 |
从右到左 |
5 |
.* ->* |
指向成员的指针 |
从左到右 |
6 |
* / % |
乘、除、取模 |
从左到右 |
7 |
+ - |
加减 |
从左到右 |
8 |
<< >> |
位移 |
从左到右 |
9 |
< > <= >= |
关系操作符 |
从左到右 |
10 |
== != |
等于、不等于 |
从左到右 |
11 |
& |
按位与运算 |
从左到右 |
12 |
^ |
按位异或运算 |
从左到右 |
13 |
| |
按位或运算 |
从左到右 |
14 |
&& |
逻辑与运算 |
从左到右 |
15 |
|| |
逻辑或运算 |
从左到右 |
16 |
?: |
条件运算 |
从右到左 |
17 |
= *= /= %= += -= >>= <<= &= ^= |= |
赋值运算 |
从右到左 |
18 |
, |
逗号 |
从左到右 |
5. C++的控制台交互:
cin 给输入使用和cout给输出使用。另外,cerr和clog也已经被实现――它们是两种特殊设计的数据流专门用来显示出错信息。
输出output:输出流cout与重载(overloaded)运算符<<一起使用
cout << x; // 打印变量 x 的值到屏幕上 cout << 120; // 打印数字 120 到屏幕上
可以用endl换行,也可以用’\n’换行
输入input:标准输入是通过在cin数据流上重载运算符extraction (>>) 来实现的
cin >> a; cin >> b; // 两个变量输入,中间用空格,tab,换行等来间隔 cin >> mystring; //一次只能读取一个单词,遇到空格就结束输入,如果要输入有空格的字符串,建议使用getline()来实现
字符串流stringstream:
string mystr ("1204"); //定义一个字符串并赋初值 int myint; getline(cin, mystr); //从标准输入给mystr赋值。 stringstream(mystr) >> myint; //从字符串mystr中提取出数据,并给myint赋值。
6. Exit函数:
原型 void exit (int exit code);
exit code是由操作系统使用或被调用程序使用。通常exit code为0表示程序正常结束,任何其他值表示程序执行过程中出现了错误。
7. 函数参数按地址传递:
地址符&表明参数是按照地址传递的。当按地址传递一个变量的时候,我们是在传递这个变量本身,我们在函数中对变量所做的任何修改将会影响到函数外面被传递的变量。
8. 函数参数的默认值:
int Add(int a, int b = 2){……} /* 定义 */ int num1 = Add(12); /* num1结果为14 */ int num2 = Add(12, 8); /* num2结果为20 */
9. 函数重载:
两个不同的函数可以用同样的名字,只要它们的参量(arguments)的原型(prototype)不同,也就是说你可以把同一个名字给多个函数,如果它们用不同数量的参数,或不同类型的参数。
int divide (int a, int b) { return (a/b); } float divide (float a, float b) { return (a/b);}
10. inline函数:
在函数声明的时候,放在函数之前,要求该函数必须在被调用的地方以代码形式被编译。这相当于一个宏定义(macro)。它的好处只对短小的函数有效,这种情况下因为避免了调用函数的一些常规操作的时间(overhead),如参数堆栈操作的时间,所以编译结果的运行代码会更快一些。
它的调用和其他的函数调用一样。不需要在之前加关键字inline。
11. 字符串和其他数据类型的转换函数:
atoi: 将字符串string 转换为整型int
atol: 将字符串string 转换为长整型long
atof: 将字符串string 转换为浮点型float
12. 动态内存分配 new 和delete :
new用法:
int * bobby; bobby = new int [5];
delete用法:
delete ptr; /* 释放单个元素内存 */ delete [] ptr; /* 释放连续多个元素的内存 */
13. 指针和结构组成的各种可能的组合:
表达式 |
描述 |
等价于 |
pmovie.title |
结构pmovie 的元素title |
|
pmovie->title |
指针pmovie 所指向的结构其元素title 的值 |
(*pmovie).title |
*pmovie.title |
结构pmovie 的元素title 作为指针所指向的值 |
*(pmovie.title) |
14. 匿名联合:
union:
struct { char title[50]; char author[50]; union { float dollars; int yens; } price; } book;
anonymous union:
struct { char title[50]; char author[50]; union { float dollars; int yens; }; } book
匿名联合可以直接引用元素名来访问,不再需要加union的名字。
对于yens,上边book.price.dollars。下边book.yens。