| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C++中的类和对象 -> 正文阅读 |
|
[C++知识库]C++中的类和对象 |
目录 一、类的基本概念在C++中的类可以用struct或者class来定义,类里面不仅可以定义变量,也可以定义函数。他们的区别是struct默认权限是public,而class的权限默认是private。 访问权限为private,说明只能在类的内部访问,无法在外面访问private成员,而public是都可以访问的。访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。 类里面的函数和声明是可以分开的,即声明在类里面,定义在类外面。 例如:
类的大小计算类中只存储成员变量,不存储成员函数,函数被放在了代码段。 如果有虚函数还得考虑虚函数表指针所占用的大小 例如:
注意:一个空类的大小为1(这个1只是为了占位) this指针在类里面有一个隐藏this指针。
PrintStudentInfo函数类之所以可以访问该类的私有成员变量,就是因为this指针的存在,相当于PrintStudentInfo(Student* this)。this指针存在栈上,因为是形参。 自己在形参里面加是不行的,但是可以在函数里面加 函数体相当于cout<<this->_name<<" "<<this->_gender<<" "<<this->_age<<endl;
二、构造函数构造函数在对象构造(实例化)时调用的函数,这个函数完成初始化的工作。 特征:
自身没有定义构造函数时,C++编译器会自动生成无参默认构造函数。
注意默认构造函数只能有一个,当自己实现了构造函数时,编译器就不会在默认生成一个构造函数 初始化列表类里面有些变量在定义的时候必须初始化,此时得用初始化列表进行初始化。 三种需要初始化列表初始化的情况
很好理解,自定义类型的成员如果没有默认的构造函数,必须手动调用带参的构造函数。引用必须初始化。常量也得初始化。
注意:初始化列表中成员列出的顺序和它们在类中声明的顺序相同。 三、析构函数析构函数是对象生命周期到了以后,自动调用,用作对象的清理。 特征:1、析构函数是在类名前加上~ 2、无参数返回值 3、一个类有且只有一个析构函数。若未定义,系统自动生成默认的析构函数 4、对象生命周期结束时,C++编译系统自动调用析构函数 5、析构函数可以在类外面定义 6、析构函数没有参数 析构的顺序局部在栈上开辟的对象,按照栈的结构后进先出进行析构。堆上的对象调用delete就进行了析构。静态局部对象比局部对象生命周期长,比全局对象短,所以会比栈上的对象后析构,全局对象最后析构。
四、拷贝构造函数创建对象时,创建一个与之前创建的对象一模一样的新对象 特征: 1、拷贝构造函数是构造函数一个重载的形式 2、拷贝构造函数的参数只有一个且必须使用引用传参,否则会引起无穷递归 3、当没有自己写拷贝构造函数时,编译器也会默认生成
需要注意的地方 1、首先拷贝构造函数不要写成下面这种形式
这样会造成无穷递归,因为当对象传入拷贝构造函数时,相当于把对象拷贝给了d,这会导致又调用一次拷贝构造,最终变为无穷递归。 解决方法就是以引用的方式传参,不会拷贝。 2、Date d3=d1;这种方式也是调用的拷贝构造函数,而不是接下来要说明的 ‘=’ 的重载,这里很容易混淆。 五、运算符重载传统的对类使用一些运算符操作例如==,是定义一个函数,对类里面的成员逐个比较。由于一些函数不够直观的展现出他的功能,想把自定义类型也可以用上运算符,所以引出运算符重载 关键字:operator operator + 操作符 + 参数 举例: operator = 的重载
假如现在定义Date d1;Date d2;d2 = d1;这个过程也可以写成d1.operator=(d2)。本质上是d1把自己的this指针传进去了。可以想象成d1.operator=(&d1,d2)。 注意:.* 、:: 、sizeof 、? : 、.??注意以上5个运算符不能重载。 ????????operator =也是编译器可以默认生成的。
六、const修饰this指针看如下代码
fuc函数里面的d调用类里面的函数发现会出错:编译器显示不兼容类型限定符,对象类型是const Date。 原因:d是常属性的,相当于d.Print(&d),而类里面的*this并没有权限限制,所以权限提升了,从而会报错。 解决办法: 在函数后面加const,相当于const Date* this,const修饰*this。
总结C++中总共六个默认成员函数 构造函数 析构函数 拷贝构造 赋值 普通对象与const对象取地址 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:48:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |