C++知识点

本文围绕C++展开,介绍了类成员的三种权限,class和struct区别,成员属性设为私有可控制读写权限。还阐述了构造函数和析构函数的特点、分类、调用方式,以及浅拷贝和深拷贝区别。此外,涉及内联函数、运算符重载、静态成员等内容,最后解答析构函数相关考点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类的成员三种权限
1.public:成员在类内和类外都能够被访问;
2.protected:成员在类内可以访问,类外不可以访问,继承类中可以访问基类中的保护成员;
3.private:成员在类内可以访问,类外不可以访问,继承类不可以访问基类的私有成员;

class和struct区别是struct默认继承权限是public,class默认继承权限是private;
成员属性设置私有,将所有成员设置私有可以直接控制读写权限
由于写权限,可以检测数据的有效性;

构造函数和析构函数
构造函数:
1.构造函数没有返回值,也不写void;
2.构造函数名称和类名相同;
3.构造函数可以有参数,因此可以发生函数重载;
4.程序在调用对象的时候自动调用构造函数,无须手动调用而且只会调用一次;
构造函数两种分类:
1.按参数:有参构造和无参构造;
2.按类型:普通构造和拷贝构造;

构造函数三种调用方式:
1.括号发:
Person per:无参构造函数调用
Person per(参数):有参构造函数调用
Person per(per1):拷贝构造函数调用
2.显示法(匿名对象)
Person per=Person():显示无参构造函数调用
Person per=Person(参数):显示有参构造函数调用
Person per=Person(per1):显示拷贝构造函数调用
匿名对象特点:当前调用完成后,系统会立即回收匿名对象
Person(per):不要使用匿名拷贝构造函数初始化匿名对象,编译器会任务per重复定义;
3.隐式转换法;
Person per=参数值 :隐式有参构造函数,编译器会隐式转换为显示法:Person per=Person(参数值)
Person per=per1:隐式拷贝构造函数调用;

析构函数:
1.析构函数没有返回值,也不写void;
2.析构函数名称与类名相同;
3.析构函数没有参数,因此不能发生重载;
4.程序在对象销毁时自动调用析构函数,无须手动调用而且只调用一次;

1.定义类型的成员
除了在类中可以定义数据和函数成员之外,类还可以自定义某种类型在类
中的别名;
typedef std::string::size_type pos;

类会提供的成员函数
1.默认构造函数(无参构造函数)
如果类中存在有参构造函数,编译器不会自动生成默认的构造函数
如果累需要默认构造函数,必须显示的把它声明出来,使用=default告诉编译器
为我们合成默认的构造函数
2.析构函数,释放在堆区申请空间的数据成员的指针
3.拷贝构造函数(浅拷贝),对象中数据成员进行值赋值
特点1:当类中写了有参构造函数,编译器不会再提供默认构造函数,但会提供拷贝构造函数;
特点2:当类中写了拷贝构造函数,编译器不会再提供其他构造函数(无参构造和有参构造函数,普通构造函数)

4.赋值运算构造函数
5.取地址运算构造函数

拷贝构造函数调用场景
1.使用一个已经创建完毕的对象初始化一个新的对象
Person per(per1);
Person per=Person(per1);
Person per=per1;
2.值传递方式给函数参数传值
void func(Person per1);
Persson per(10);
func(per); 隐式拷贝构造函数per1=per;
3.以值得方式返回函数的局部对象
Person func()
{
Person per;
return per;
}
Person per1=func();//per1=per隐式拷贝构造函数后,per会被先析构

浅拷贝和深拷贝的区别
1.浅拷贝,若类中不存在拷贝构造函数,会提供默认的拷贝构造函数(浅拷贝),可以进行对象值赋值
但当数据成员中存在需要在堆区申请空间时,析构时浅拷贝会造成空间双重释放问题;
2.深拷贝,当数据成员中存在需要在堆区申请空间时,会调用深拷贝,重新申请新的空间
可以避免析构时堆区空间被对次释放问题;

内联函数:在类中成员函数中不加inline关键字,是隐式内联函数
加inline关键字为显示内联函数;
类中不加inline关键字申明,但类外定义加inline关键字

C++重载前置和后置运算符
1.前置运算符重载对对象本身++运算后,需要返回本对象的引用,用于支持链式编程
2.后置运算符重载需要先保存旧对象值到临时变量中并返回,再对对象本身做++运算
3.使用全局友元函数对输出流<<进行运算符重载,用于对对象各成员进行输出,
所以后置++运算会产生临时对象,参数传入int占位符用于区分前置和后置

C++类中构造函数哪些可以使用初始化列表
1.类对象作为数据成员时:对象类只有参构造函数,无默认构造函数
若想调用有参构造函数,在初始化该对象时,应使用初始化列表方式(先调用该对象的构造函数,在调用本类对象构造函数);
2.数据成员是引用或const修饰的变量时:引用和常量在定义时只能被初始化一次,在构造函数体中进行
初始化方式叫做赋值,所以应使用初始化列表;

静态数据成员和静态成员函数
1.类中定义静态数据成员,类外进行初始化,但前面不加static修饰
静态数据成员被类所有对象共享一份数据,所有非静态成员函数可以进行访问
2.静态成员函数只能访问静态数据成员,因为静态成员函数也是被所有对象共享
形参列表中没有this指针,无法访问某个对象的非静态数据成员,但可以通过
参数对象来进行访问;同样在类外进行定义时,前面不加static修饰

类对象大小
1.类的数据成员和成员函数是分开存储的
2.空对象sizeof的大小为1,因为编译器为每一各空对象分配一个
字节的大小空间,用于区分每个对象在内存中的位置,每一个对象在
内存中都应该有一个唯一的内存地址;
3.静态数据成员是所有对象共享的,所以不占用对象内存空间;

this 指针
this指针隐含在每一个非静态成员函数内,指向被调用成员函数所属
的对象;
1.当形参和数据成员变量同名时,可以使用this指针来区分;
2.在类的非静态成员函数返回对象本身时,可以使用return *this;
这也是为什么静态成员函数不能访问非静态数据成员,因为形参列表中没有this指针

常对象和常函数
常函数
1.成员函数后加const后,称函数为常函数
2.常函数内不可以更改数据成员
3.数据成员加mutable关键字修饰后,在常函数中依然可以进行修改

常对象
1.声明对象前加const称为常对象
2.常对象只能调用常成员函数;

友元:在程序里,类的私有属性也想让类外的一些特殊函数或类
访问,就需要用到友元技术,就是让一个函数或类访问另一个类中的私有成员
友元的三种实现
1.全局函数做友元,想访问哪个类的私有属性,就将该函数声明在类中并加上friend关键字
2.类做友元;
3.成员函数做友元;

重做+运算符
1.成员函数重载加号运算符:
对象本身和传入参数对象进行各成员相加赋值给新的局部对象并返回该对象
2.自定义成员函数实现两个对象相加:
和成员函数重载实现一样,只是不是函数重载
3.全局函数重载加号运算符
类外实现全局函数加号运算符重载

请你回答一下为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数 考点:虚函数 析构函数
参考回答:
将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。

C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值