目录
1 引用
引用就是给一个变量取“别名”,这也就意味着引用值(别名)改变的话,原值必然也跟随改变。
引用的本质是指针常量(编译器内部会自动完成指针操作)。
int a = 15;
//自动转换为 int* const ref = &a
//指针常量的指向不会变化,印证了引用不可变的特性
int& ref = a;
1.1 常量引用
常量引用主要用来修饰形参,防止误操作引用值,进而改变原始变量的值。
//引用通常用来修饰形参
//这里形参增加const之后,在该函数中v值不可发生变化。
void showValue(const int& v) {
//v += 10; //不可修改;error-需要是可修改的左值
cout << v << endl;
}
int main() {
//引用本身需要一个合法的内存空间,因此这行错误
//需要先有定义原始变量,同时为原始变量分配内存空间
//int& ref = 10;
//加入const就可以了,编译器优化代码,int temp = 10; const int& ref = temp;
const int& ref = 10;
//ref = 100; //加入const后不可以修改变量
cout << ref << endl;
//函数中利用常量引用防止误操作修改实参
int a = 10;
showValue(a);
system("pause"); //暂停退出输出屏幕(使得黑屏保持停留)
return 0;
}
1.2 引用做函数返回值
引用可以作为函数返回值使用。
切记不能返回局部变量。(局部变量在栈区存储,它的声明周期仅限函数执行的周期内,执行结束之后编译器会自动的释放掉,这样会导致引用值出现意想不到的结果)
2 函数重载
重载条件:
同一个作用域下;函数名称相同;函数参数类型不同或者参数个数或者参数的顺序不同。
不可以仅仅以函数返回值不同作为函数重载的条件。
//函数重载需要函数都在同一个作用域下
void func(int a){
cout << "func (int a) 的调用!" << endl;
}
void func(double a){
cout << "func (double a)的调用!" << endl;
}
void func(int a ,double b){
cout << "func (int a ,double b) 的调用!" << endl;
}
void func(double a ,int b){
cout << "func (double a ,int b)的调用!" << endl;
}
//不可以仅仅以返回值不同为条件;函数返回值不可以作为函数重载条件
//int func(double a, int b){
// cout << "func (double a ,int b)的调用!" << endl;
//}
int main() {
func(10);
func(3.14);
func(10,3.14);
func(3.14 , 10);
system("pause");
return 0;
}
3 对象初始化和清理
C++中利用构造函数和析构函数完成对象的初始化和清理,他们由编译器自动调用执行。对象的初始化和清理是编译器强制要求进行的操作。
构造函数
- 构造函数:创建对象时为对象成员赋值,自动调用。
- 没有返回值,语法 类名(){}
- 函数名称和类名相同,可以有参数(因此可以发生重载)。
注意:
- 上述实例中若是 //Person(10)单独写就是匿名对象 当前行结束之后,马上析构(也就是只能执行一行)。不能利用拷贝构造函数初始化匿名对象。
- 拷贝构造函数是利用已经生成的对象初始化另一个对象。
析构函数
- 析构函数:对象销毁前系统自动调用,用于执行清理工作。
- 没有返回值,语法 ~类名(){}
- 析构函数不可以有参数,因此也不可以发生重载。
构造函数调用规则如下:
- 如果用户定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造
- 如果用户定义拷贝构造函数,c++不会再提供其他构造函数