C++中类和对象的一些注意事项

1. struct和class的区别

默认的访问权限不同, struct默认访问权限是public, 而class的默认访问权限是private.

2. 构造析构函数

2.1 注意事项

  • 匿名构造函数在当前行结束后, 系统会立即释放其内存占用.
  • 不要用匿名拷贝构造函数.
  • 创建一个类之后, 编译器会自动创建三个函数, 默认构造函数, 默认析构函数, 拷贝构造函数. 如果我们提供有参构造或者拷贝构造函数, 那么编译器就不再提供默认构造.
  • 当其他类的对象作为本类成员时, 先构造其他类的对象, 再构造本类对象. 析构则是反过来.
  • 构造函数不能声明为const,因为构造函数的意义在于初始化。
  • 成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。

2.2 限定对象只能在堆/栈上创建

2.2.1 限定对象只能在堆上创建

错误方法:

把构造函数设为私有。但是这样做,用new在堆上创建对象的时候也会调用构造函数,这样就无法在外部调用类的构造函数了。

方法1:

将析构函数设为私有,因为创建在栈上的对象是由编译器分配和释放内存空间,编译器为对象分配内存空间时,会对类的非静态函数进行检查,即编译器会检查析构函数的访问性。当析构函数设为私有时,编译器创建的对象就无法通过访问析构函数来释放对象的内存空间,因此,编译器不会在栈上为对象分配内存。

方法1问题:

1. 将析构函数设置为私有,调用delete删除对象的时候,delete也需要调用析构函数,所以无法调用delete。需要多创建一个destroy()函数来释放对象所占有的资源。

2. 将析构函数设置为私有,那么当此类作为基类时,析构函数需要设置为虚函数,派生类无法访问基类的构造函数,无法实现多态。

方法2:

针对方法1的问题,可以将构造函数和析构函数都设置为protected,并在类内部用create(), destroy()函数创建和销毁对象,这样可以保证对象在堆创建,同时也能让子类访问析构函数。

2.2.2 限定对象只能在栈上创建

可以将operator new设为私有,如以下代码:

class A
{
private:void *operator new(size_t t) {}    // 注意函数的第一个参数和返回值都是固定的void operator delete(void *ptr) {} // 重载了 new 就需要重载 delete
public:A() {}~A() {}
};

3. 深拷贝和浅拷贝

  • 拷贝构造函数就是浅拷贝
  • 深拷贝需要自己在拷贝构造函数中实现

4. 静态成员

4.1 静态成员变量

所有对象都共享同一份数据, 且编译阶段就分配了内存(分配到了全局区). 类内进行声明, 在类外进行初始化.

4.2 静态成员函数

静态成员函数只能访问静态成员变量.

5. 类所占用的空间大小

  • 类中只有类的非静态数据成员占用类的对象的空间, 而静态数据成员以及成员函数都是分开存储的, 其所有对象都共享静态数据成员以及成员函数.
  • 空类占用一个字节, 为了区分对象.
  • 由于类初始化对象之后, 对象中只存储自身的非静态数据成员, 而成员函数是分开存储的, 对象调用自身成员函数时是将自身的this指针传进成员函数中, 便于其区分是哪个实例化的对象来调用, 所以当有如下代码时:
class Circle {
public:void showClassName() {printf("this is Circle class");}void showR() {printf("R: %d", m_R);}
private:int m_R;
};int main() {Circle* pCircle1 = NULL;pCircle1->showClassName(); //不会报错, 虽然传入成员函数的this指针是NULL, 但是并没有用//到this指针访问其非静态数据成员pCircle1->showR();         //报错, 因为成员函数内部访问了m_R, 会转换成访问this->m_R, //由于this是空指针, 所以会报错
}

6. const修饰

6.1 const修饰成员函数

const修饰成员函数叫做常函数(const放在形参列表后面, 本质是把this指针修饰为其指向的对象的值不能修改), 其内部不可以修改数据成员, 除非数据成员前面有mutable关键字, 那么常函数也能修改该成员.

6.2 const修饰对象

如果对象声明的时候用const修饰(常对象), 那么该对象就只能调用成员函数中的常函数. 其数据成员(未被mutable修饰)也不可以修改.

7. 友元

7.1 全局函数作友元

友元函数可以访问类中的私有成员. 把函数在类前面声明一下就可以.

7.2 类作友元

友元类可以访问类中的私有成员. 把friend class +类名在被访问的头部声明一下就可以.

7.3 类中成员函数作友元

8. 继承

9. 多态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中类和对象的一些注意事项 ---继承

1 继承中的访问权限问题 所有继承方式, 子类都无法访问父类的private成员. 那么用如下测试代码尝试一下: #include <iostream> using namespace std;class father { public:int m_father_public_value; protected:int m_father_protected_value; private:int m_father_…

C++中类和对象的一些注意事项 --- 多态

1. 一些继承中的问题 1.1 多继承中父类含有重名成员问题 如下: #include <iostream> #include <string> using namespace std;class father1 { public:father1() {class_name "father1";}string class_name; };class father2 { public:father2() {cl…

电脑按f8无法进入安全模式_自已有电脑的人,都会遇到系统死机问题,教大家实用一招自已解决...

其实我们电脑死机蓝屏重启并不可怕&#xff0c;如果只要懂得最基本的一些查找方法就可以解决这些问题&#xff0c;因为电脑是一个完整的系统&#xff0c;既然是系统工程必须由硬件与软件共同合作才能完成出色的任务&#xff0c;如果电脑出现死机蓝屏等问题可以参考以下方式进行…

台式电脑键盘字母乱了_键盘侠的育儿经利用键盘引导学龄前儿童正确使用电脑、学习英文字母和拼音...

点击上方“总想做自己”关注我可以订阅哦一点资讯邀约作者&#xff1a;方游专注探讨个人成长与正向激励的话题&#xff0c;有干货&#xff0c;不再错过&#xff0c;快来点击关注吧&#xff01;微信公众号&#xff1a;apple_seeworld难得机会与孩子在家里有长达半月的相处&#…

C++模板的注意事项

函数模板 template <typename T> //把typename换成class也可以 函数模板调用方法 使用过程中, 有两种方法调用, 如下: 自动类型推导:#include <iostream>template <class T> void swap(T &first, T &second) {T temp;temp first;first se…

excel教程自学网_Excel自学教程:万能查找函数Lookup的神应用和技巧

提起查找函数&#xff0c;大家第一时间想到的肯定是Vlookup&#xff0c;其实大多数人不知道&#xff0c;Lookup才是查找函数之王&#xff0c;它几乎能高效地实现Vlookup函数的所有功能&#xff0c;部分功能是Vlookup函数无法比拟的。一、语法结构和基本使用方法。应用场景&…

C++ STL 容器的一些总结

1 C STL类型及实现原理 1.1 顺序容器 容器中的元素为有序排列,可以指定元素插入位置. 1.1.1 vector 顺序存储, 初始化过程会分配一定量空间, 在尾部插入会很快, 但是在中间插入元素, 会把之后所有元素向后平移, 所以较慢(中间删除元素同理). 如果元素个数超过当前限制, 会重…

java电商项目简历_一文解析从写简历,到面试、谈薪酬技巧和防坑指南

点击上方“码农沉思录”&#xff0c;选择“设为星标”优质文章&#xff0c;及时送达读者大大们好&#xff0c;好几天没更新了。一方面因为这几天工作忙&#xff0c;占了写作的时间。另一方面是在准备这篇文章各种素材&#xff0c;今年是最难求职年&#xff0c;我希望通过这篇文…

qq浏览器极速版_安卓手机QQ轻聊版大升级,极速版正式上线:无广告/省内存

8月28日&#xff0c;安卓手机QQ极速版推出了4.0正式版&#xff0c;采用了全新的界面设计&#xff0c;仅保留了基本聊天功能和QQ空间、小程序、钱包、文件等少量QQ主推功能&#xff0c;现已开放下载&#xff0c;QQ极速版安装之后会覆盖QQ轻聊版。QQ极速版4.0界面焕新升级&#x…

C++ STL 容器 vector

1 vector简介 顺序存储, 初始化过程会分配一定量空间, 在尾部插入会很快, 但是在中间插入元素, 会把之后所有元素向后平移, 所以较慢(中间删除元素同理). 如果元素个数超过当前限制, 会重新分配更大空间, 再把原容器中所有元素都拷贝到新的容器中. 优点: 支持随机访问(用下标…

3dmax卸载工具_3dmax软件如何彻底卸载?

近期有很多学员遇到关于3dmax软件卸载的问题&#xff0c;有的是想安装更高版本但不知道如何卸载更安全&#xff0c;有的是自己卸载了之后再安装其他版本却总是无法成功&#xff0c;这对此类问题&#xff0c;今天我做一个详细讲解&#xff1b;根据自己所遇问题&#xff0c;找到最…

C++ STL一些注意事项

1 STL简介 STL(standard template library: 标准模板库), 主要有六大组件: 容器算法迭代器仿函数适配器(配接器)空间配置器 2 容器 3 算法

华为app安装失败与已安装签名_手机APP为什么总是安装失败

整天“机不离手”的我们每个人手机里都装有好几十个APP但安装的时候总会出现跳出手机APP无法安装或安装失败的页面这究竟是怎么回事呢&#xff1f;小翼带你瞅瞅一、手机安全认证在安装或下载应用程序时&#xff0c;如果提示失败可能是因为系统“未知来源”没有开启。可以通过打…

C++ STL 中提供的算法

1 算法 1.1 for_each() 参数有三个: 首迭代器尾迭代器执行的函数 例如如下代码: #include <algorithm> //必须包含 #include <vector> using namespace std;int main() {vector<int> tmp;tmp.push_back(10);tmp.push_back(20);tmp.push_back(30);tmp.pu…

arma模型_GARCH模型应用:以国泰君安为例

1.下载国泰君安股票数据&#xff0c;计算对数收益率(1)首先安装包"quantmod"&#xff0c;这个包可以从雅虎财经的下载股票数据&#xff0c;具体包的解释见"【量化基础】R语言获取金融数据之quantmod包"。install.packages("quantmod")#安装包qua…

C++ STL 容器 string

1 string string内部含有一个char*字符串 2 string构造方式 无参构造 string str; 字符串构造 string str("abcd"); 拷贝构造n个相同字符 string str(10, k); //初始化为10个k 3 string赋值操作 可以有以下操作: void string_test() {string str1;str1 &qu…

小程序webview不全屏_小程序不在小(深度)

原标题&#xff1a;小程序不在小(深度)你问&#xff1a;“微信小程序适合哪些行业?”&#xff0c;回答是&#xff1a;“所有行业!”你可以想一下那些做过APP的公司&#xff0c;不管是任何行业的公司都可以拥有属于自己的APP&#xff0c;而从来不会有人问他们你们用的APP是否适…

leetcode 4 --- 寻找两个有序数组的中位数

1 题目 给定两个大小为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。 进阶&#xff1a;设计一个时间复杂度为 O(log (mn)) 的算法. 2 解法 这个题如果mn是偶数, 就是找到第(mn)/2以及第(mn)/2 1个数, 如果…

python语言命名规则-一文轻松掌握python语言命名规范规则

和C/C、Java等语言一样&#xff0c;python在命名上也有一套约定俗成的规则&#xff0c;符合规范的命名可以让程序的可读性大大增加&#xff0c;从而使得代码的逻辑性增强&#xff0c;易于自己和其他协作者在以后的拓展中理解代码的意义&#xff0c;从而提高编写代码的效率。 我…

leetcode 142 --- linked-list-cycle-ii

1 题目&#xff1a; 对于一个给定的链表&#xff0c;返回环的入口节点&#xff0c;如果没有环&#xff0c;返回null 拓展&#xff1a; 你能给出不利用额外空间的解法么&#xff1f; 代码&#xff1a; class Solution { public:ListNode *detectCycle(ListNode *head) {} …