C++| 引用 重载 对象初始化

目录

1 引用

1.1 常量引用

1.2 引用做函数返回值

2 函数重载

重载条件:

3 对象初始化和清理

构造函数

析构函数

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++不会再提供其他构造函数

猜你喜欢

转载自blog.csdn.net/qq_38844835/article/details/119962076