每日一练---- 3.01oj总结(拷贝构造函数与友元函数)
Posted 赏一杯茶:
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一练---- 3.01oj总结(拷贝构造函数与友元函数)相关的知识,希望对你有一定的参考价值。
- 引用的知识点
- 引用初始化以后不能被改变,指针可以改变所指的对象(对)
- 引用传值,指针传地址(错)
对于问题1,看如下代码
int main()
int a = 10;
int b = 20;
int& ra = a;
ra = b;
此时ra不会变成变量b的引用,仍是变量a的引用。故引用初始化后不能被改变。这里理解ra=b是将b的值赋值给ra和a
对于问题2,引用的底层汇编仍是传的变量的地址,故引用也是一种传址调用。
- 拷贝构造函数的知识点
- 拷贝构造函数的调用情况
2.拷贝构造函数与赋值重载的区别
调用拷贝构造的函数有往往有三种情况
1.函数的形参非该类的引用
2.函数的返回值非该类的引用
3.用一个已有的对象去初始化该类的一个新对象
给出如下代码解释这三种情况:
class A
int _a;
public:
A(int x)
_a = x;
A(A& x)
cout << "调用拷贝构造" << endl;
_a = x._a;
A& operator=(A x)
cout << "调用赋值运算符" << endl;
this->_a = x._a;
;
A F(A data)
return data;
int main()
A aa(1);
A b(aa);
F(bb);
return 0;
总共调用了三次拷贝构造函数
关于拷贝构造函数与赋值重载的区别:
当用一个已初始化对象去初始化该类的一个新对象时,无论是以括号的形式传值或以赋值的形式,调用的都是拷贝构造函数,代码如下:
class A
int _a;
public:
A(int x)
_a = x;
A(A& x)
cout << "调用拷贝构造" << endl;
_a = x._a;
//A& operator=(A x)
//cout << "调用赋值运算符" << endl;
//this->_a = x._a;
/
;
int main()
A aa(1);
A bb = aa;
A cc(bb);
return 0;
当我们修改代码
class A
int _a;
public:
A(int x)
_a = x;
A(A& x)
cout << "调用拷贝构造" << endl;
_a = x._a;
A& operator=(A& x)
cout << "调用赋值运算符" << endl;
this->_a = x._a;
return *this;
;
int main()
A aa(1);
A bb(2);
bb = aa;
return 0;
会出现如下结果:
3. 友元函数重载运算符
- 因为友元函数非成员函数,故它不会默认传this指针,所以将操作符重载乘友元函数时,必须传给友元函数一个参数
像如下代码编译器就会报错处理
class student
int _num;
string _name;
public:
friend student& operator++()
this->_num++;
return *this;
;
int main()
student s;
return 0;;
修改过后即可
class student
int _num;
string _name;
public:
friend student& operator++(student& data)
data._num++;
return data;
;
int main()
student s;
return 0;;
以上是关于每日一练---- 3.01oj总结(拷贝构造函数与友元函数)的主要内容,如果未能解决你的问题,请参考以下文章
每日一练---- 3.02 3.03 3.04oj总结(类知识点)
每日一练---- 3.02 3.03 3.04oj总结(类知识点)
每日一练---- 3.02 3.03 3.04oj总结(类知识点)
每日一练---- 3.07 3.08 3.09oj总结(继承重载多态动态与静态绑定)