文章目录

  • 对指针的引用和指针的指针到底是怎么一回事?
  • 函数返回引用到底返回了什么?
  • 拷贝构造函数和默认拷贝构造函数
    • 自定义拷贝构造函数
    • 使用默认拷贝构造函数
  • =赋值运算符重载

对指针的引用和指针的指针到底是怎么一回事?

#include<iostream>int i = 47;
int* p = &i;
void f(int** ip)
{std::cout << "ip :" << ip <<std::endl;std::cout << "*ip :" << *ip <<std::endl;std::cout << "**ip :" << **ip <<std::endl;
}void g(int* &dp)
{std::cout << "dp :" << dp << std::endl;std::cout << "*dp :" << *dp << std::endl;//std::cout << "**dp :" << **dp << std::endl; //error
}
// Error
//void h(int&* p) {}
int main()
{std::cout << "&i的值:" << &i << std::endl;std::cout << "i的值:" << i << std::endl;std::cout << "&p的值" << &p << std::endl;std::cout << "p的值" << p << std::endl;std::cout << "*p的值" << *p << std::endl;f(&p);g(p);system("pause");return 0;
}


指针的引用:两个指针指向同一个变量,解引用的内容相同,不能进行解引用的解引用
指针的指针:第一个指针指向另一个指针地址(第一个指针中存了第二个指针的地址),第一次解引用活得一个指针中的内容(指向一个对象的地址),第二次解引用获得指针内容(地址)中的内容。

函数返回引用到底返回了什么?

函数返回引用,返回了一块不会随着函数结束而结束的内存,所以针对这个返回值,可以把它当作普通对象进行赋值,也可以对其进行引用。

int& f(int& x)
{std::cout << "&x : " << &x << endl;return x;
}int main()
{int b = 1;std::cout << "&b " << &b<<endl;//int c = 1;//std::cout << "&c" << c;int& c = b;std::cout << "&c " << &c<<endl;int& d = f(b);int e = 1;std::cout << "&e " << &e << endl;e = f(b); //这里是一次赋值运算std::cout << "&f(b) " << &f(b) << endl;std::cout << "&d " << &d<<endl;std::cout << "&e " << &e << endl;}


从程序运行的结果看,对于f()函数的返回值有两种使用方式,第一种只取其值,这样的话变量有自己的地址。第二种不仅取其值,还取其地址。

拷贝构造函数和默认拷贝构造函数

拷贝构造函数的调用出席在用一个类初始化另一个类的时候。默认拷贝构造函数再将类内的指针传递时采取按值传递的方式这样就会产生多个对象内的指针指向同一个地方。

自定义拷贝构造函数

#include <iostream>
#include <string>
using namespace std;static int countA = 0;class A
{public:int* AI;public:A() :AI(nullptr){AI = new int(countA);countA++;std::cout << "this is A() : " << countA << endl;}A(const A &a){AI = new int(*a.AI);countA++;std::cout << "this is A(A&) : " << countA << endl;}~A() {countA--;std::cout << "this is ~A() : " << countA << endl;if (AI != nullptr);{std::cout << "*AI : " << *AI << endl;std::cout << "AI : " << AI << endl;}}A& operator = (const A& a){AI = a.AI;std::cout << "this is operator = : " << countA << endl;return *this;}};void fA(A a) {};int main()
{A a1;A a2 = A(a1);fA(a1);
}


指针的地址不一样

使用默认拷贝构造函数

#include <iostream>
#include <string>
using namespace std;static int countA = 0;class A
{public:int* AI;public:A() :AI(nullptr){AI = new int(countA);countA++;std::cout << "this is A() : " << countA << endl;}/*A(const A &a){AI = new int(*a.AI);countA++;std::cout << "this is A(A&) : " << countA << endl;}*/~A() {countA--;std::cout << "this is ~A() : " << countA << endl;if (AI != nullptr);{std::cout << "*AI : " << *AI << endl;std::cout << "AI : " << AI << endl;}}A& operator = (const A& a){AI = a.AI;std::cout << "this is operator = : " << countA << endl;return *this;}};void fA(A a) {};int main()
{A a1;A a2 = A(a1);fA(a1);
}


指针地址一样。

=赋值运算符重载

#include <iostream>
#include <string>
using namespace std;static int countA = 0;class A
{public:int* AI;public:A() :AI(nullptr){AI = new int(countA);countA++;std::cout << "this is A() : " << countA << endl;}A(const A &a){AI = new int(*a.AI);countA++;std::cout << "this is A(A&) : " << countA << endl;}~A() {countA--;std::cout << "this is ~A() : " << countA << endl;if (AI != nullptr);{std::cout << "*AI : " << *AI << endl;std::cout << "AI : " << AI << endl;delete AI;}}A& operator = (const A& a){if (this == &a) //避免自赋值{return *this;}AI = new int (*a.AI);std::cout << "this is operator = : " << countA << endl;return *this;}};void fA(A a) {};int main()
{A a1;A a2 = A(a1);fA(a1);A a3;a3 = a1;
}

当对象中有指针时,必须自定义拷贝构造函数 和 赋值运算符 否则在析构函数删除对象时会出错。为了防止出错可以删完在赋值为nullptr(这并不能保证不会出错).

#include <iostream>
#include <string>
using namespace std;static int countA = 0;class A
{public:int* AI;public:A() :AI(nullptr){AI = new int(countA);countA++;std::cout << "this is A() : " << countA << endl;}//没有拷贝构造函数会出错A(const A &a){AI = new int(*a.AI);countA++;std::cout << "this is A(A&) : " << countA << endl;}~A() {countA--;std::cout << "this is ~A() : " << countA << endl;if (AI != nullptr);{std::cout << "*AI : " << *AI << endl;std::cout << "AI : " << AI << endl;delete AI;AI = nullptr;}}A& operator = (const A& a){if (this == &a) //避免自赋值{return *this;}AI = new int (*a.AI); //这样不会产生错误//AI = a.AI; //这回产生错误std::cout << "this is operator = : " << countA << endl;return *this;}};void fA(A a) {};int main()
{A a1;A a2 = A(a1);fA(a1);A a3;a3 = a1;
}

这个错误就是对于多个对象内的指针变量指向同一个地方,在析构函数中释放内存会产生的错误

C++编程思想:指针,引用,拷贝构造函数,赋值运算符相关推荐

  1. C++小品:吃火锅与shared_ptr,指针,拷贝构造函数和delete

    C++小品:吃火锅与shared_ptr,指针,拷贝构造函数和delete 读者Terry问到一个关于拷贝构造函数的问题,大家可以参考答Terry:拷贝构造函数,其中论述了拷贝构造函数的必要性,然而, ...

  2. 【C/C++】拷贝构造函数 赋值运算符的重载

    1.拷贝构造函数 1.1拷贝构造函数基本形式 就类对象而言,相同类型的类对象是通过拷贝构造函数来在对象初始化期间完成整个复制过程的. 拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的 ...

  3. 智能指针的拷贝构造函数和移动构造函数的作用和目的

    unique_ptr uinque_prt的拷贝构造函数的作用和目的 std::unique_ptr的拷贝构造函数的作用和目的是禁止拷贝语义,即不允许复制一个std::unique_ptr对象.这是由 ...

  4. java编程思想初始化引用,JAVA编程思想--第5章 初始化与清理

    随着计算机革命的发展,"不安全"的编程方式已逐渐成为编程代价高昂的主因之一. 初始化和清理(cleanup)是涉及安全的两个问题.初始化时,忘记初始化时许多错误的来源,还有就是不知 ...

  5. 拷贝构造函数的第一个参数必须是自身类类型的引用

    拷贝构造函数的第一个参数必须是自身类类型的引用 拷贝构造函数的定义:如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数 第一个参数必须是自身类类型的引 ...

  6. 什么是拷贝构造函数?拷贝构造函数何时被调用

    1.什么是拷贝构造函数: CA(const CA& C)就是我们自定义的拷贝构造函数.可见,拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变 ...

  7. C++ 拷贝构造函数 赋值构造函数

    关键字:   C++      默认拷贝构造函数的行为如下:  默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造.  拷贝构造函数对类中每一个数据成员执行成员拷贝(me ...

  8. 基础备忘:拷贝构造函数和赋值函数

    3.1 拷贝构造函数概述 现在我们来学习一种特殊的构造函数--拷贝构造函数. 对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同 ...

  9. 拷贝构造函数和赋值函数(转)

    标签: 无标签 原帖地址:http://www.programfan.com/blog/article.asp?id=10944 现在我们来学习一种特殊的构造函数--拷贝构造函数. 对于普通类型的对象 ...

最新文章

  1. 第二次打开不是最大_“相亲失败,也许不是坏事”
  2. Anu Has a Function CodeForces - 1300C(二进制位运算)
  3. 精品教程--Android组件详解
  4. 关于如何在网页中添加自己的QQ客服方法
  5. 工作笔记 - Android make文件学习(主要是编译Android apk)
  6. 又一次寻找bug的经历...这次是 openlayers + chrome + win7
  7. ubuntu无法打开外接硬盘
  8. mysql union (all) 后order by的排序失效问题解决
  9. java powermockrunner_java – PowerMock从@RunWith(PowerMockRunner.class)注释中抛出异常
  10. 函数参数中的中括号代表什么
  11. Oracle 批量修改字段长度
  12. 鸿蒙3.0系统下载,鸿蒙os3.0系统官网版-华为鸿蒙os3.0下载官网手机版-66街机网
  13. 本地可以ping远程的服务器,但服务器不能ping本地
  14. 力扣438. 找到字符串中所有字母异位词 C++ (滑动窗口 + 数组)
  15. 首行缩进,文字之间的间距
  16. UE4 键盘控制开关灯
  17. “建房收租”网络时代人人可做
  18. 不要让 Chrome 成为下一个 IE!
  19. 如何通过 HTML+CSS+JS 制作焦点轮播图
  20. Mac更新系统后,无法正常打开AE的解决办法

热门文章

  1. XCTF-高手进阶区:NewsCenter
  2. (八)React原理
  3. android点击按钮底部暗影,android – 圆形按钮,像5.0 FAB一样的阴影
  4. python单选按钮重置_python – Tkinter单选按钮初始化错误
  5. 如何把一些不同类型的数据混合存入一片内存中_如何从技术上增强以太坊的隐私性?...
  6. ubantu实现linux命令的实验_C语言实现linux命令---ls
  7. 用原生JavaScript实现简单轮播图
  8. [译] Android 的多摄像头支持
  9. RPC(Remote Procedure Calls)远程过程调用
  10. 机器学习能诊断病情,还能预测患者出院后的情况?