c++学习笔记系列:http://blog.csdn.net/column/details/17301.html
这个系列整理了一下学习c++的知识点,本篇简单提及一些基础的东西,涉及到一些具体的知识后面的篇章会细说。
1、基本类型取值范围
在c++中,int、long、double、short、float等的取值范围不是固定的,是与系统有关的,与Java不同。
2、引用参数:
在参数类型后面加&即可,如:
int &count
引用参数与原参数指向同一地址,是原参数的别名而已。与传值参数的区别:
int m = n;
int &m = n;
第一条是值参数,将n的值赋予m,m和n没有关系。
第二条是引用参数,将n的引用赋予m,m只是n的别名,当n或m值改变时另外一个也会跟着改变
3、防止“==”和“=”混淆
在c++中,如果“==”和“=”使用错误(如该使用“==”的地方使用了“=”),由于c++和Java不同,很多时候并不报错。比如在if判断语句中
if(n = 1)
并不会报错(在Java中就会报错),因为c++中任何非零值都当成true。
为了防止混淆,在“==”语句中一般将变量放在右边,如:
7==n
这样的话当写错成“7=n”的时候编辑器就会报错。
4、默认实参
默认实参:函数的某个参数不经常使用,可以给函数形参一个默认值,在调用该函数时可以忽略这个参数。
默认实参必须是函数参数列表最靠右边的参数。当调用具有多个默认实参的函数时,如果省略的实参不是形参列表中最靠右的参数,那么该实参右边的所有参数也必须被省略。如:
函数原型
int volume(int length = 1, int width = 1, int height = 1);
调用
volume()
volume(10)
volume(10, 8)
volume(10, 8, 2)
都是可以的。
5、一元作用域和二元作用域
作用域运算符(::)
当局部变量和全局变量有相同名字时,用一元作用域分辨运算符来区分。
在局部变量的作用域中,直接使用变量则使用的是局部变量,而加上(::)来使用变量则使用的是全局变量,如:
int number = 10;
void get(){
int number = 1;
number = 2; //这时是给局部变量number赋值
::number = 3; //这时是给全局变量number赋值
}
当局部变量和类作用域变量有相同名字时,用二元作用域分辨运算符来区分。
与上面类似,加上(类型::)来使用变量是类作用域变量。
注意区分类作用域变量和全局变量,全局变量不在类内部。
6、重载与默认参数
当函数有默认参数时,重载时要格外注意,防止出现二义性。如:
函数原型
int volume(int length = 1, int width = 1, int height = 1);
重载函数
int volume(int length, int width)
这样的话当调用volume(2, 3)时编译器就不知道选择哪个函数。
7、函数模板
所谓函数模板实际上是建立一个通用函数,其涵涵素类型额形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。
凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次即可。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
类似java中的泛型。详细见:http://blog.csdn.net/chzphoenix/article/details/78257974
定义函数模板的一般形式为:template <typename T>或者template <class T>
例如:
template<typename T>
T n_add(T a,T b){}
可以替代:
int n_add(int a,int b)
double n_add(double a,double b)
等函数,不必重复定义这么多函数了。
8、求值顺序
c++中没有指定大多数运算符其操作数的求值顺序。只明确指定了“&&”、“||”、“,”、“?:”这四种运算符的操作数的求值顺序。
所以不能直接认为操作数的顺序是从左向右的,不同的编译器可能顺序不同。
如:
int c;
int a(){
return c + 2;
}
int b(){
return c++;
}
a() + b();
不能直接认为a()一定在b()前运算,所以在做改变了操作数中自身值得运算一定要格外小心。
9、常量的声明和赋值
使用const限定符声明一个常量变量,常量变量必须在声明时用一个常量表达式来初始化,而且之后不能修改。
声明常量是没有赋值,是一个编译错误。
在可执行语句中给常量变量赋值也是一个编译错误。
10、setfill
填充指定字符,是粘性的。所以一条语句中setfill后面的都会进行填充。
注意:因为是粘性的,所以setfill之后如果不再需要填充一定要恢复。
11、拷贝构造函数
必须以引用的形式接收参数,而非值,否则会无穷递归。
因为如果是值的形式,在调用拷贝构造函数时,会传一份拷贝,这样又调用了拷贝函数,产生了无限递归。
12、虚悬指针
如果两个对象都指向同一内存,一个对象回收时析构函数会删除这块内存的分配。另外一个对象就变成了虚悬指针,会引起运行错误。
13、函数返回局部变量
返回局部变量引用或指针是常见的错误,因为局部变量在函数完成就回收了。
网友评论