C++的类

举报
无敌清风蓝 发表于 2023/08/31 21:54:52 2023/08/31
【摘要】 C++的类

1.访问类的成员

类的话,如果用类的对象访问,就使用对象名.成员名 来访问成员

如果用指向这个对象的指针来访问,就使用指针名->成员名 来访问成员

struct student
{
    int a;
    char name[100];
    void func() {};
};

student stu;
stu.a = 100;
stycpy_s(stu.name, sizeof(stu.name), "zhangsan");

student * pstu = & stu;
pstu->a = 10000;

类中public修饰的成员就是类的访问接口,供外界调用

private实现各种功能的细节方法,但不暴露给外界(使用者),使用者无法使用这些private成员

struct默认是public,class则是private

2.类声明

类定义放在一个头文件中,而多个cpp文件中都包含这个头文件,那不就相当于这个类定义了多次吗?我们知道一个变量不允许定义多次,一个类难道允许定义多次?这个确实允许的,类是特殊的存在,这一点与定义一个全局变量不同,所以很多人也把类定义称为类声明

3.构造函数的参数

1.构造函数的默认参数,也就是Time(int a, int b = 10),所以b就是默认参数

在具有多个参数时,默认参数都必须在非默认参数的右边,一旦为某个参数指定默认值,则它后面的参数也必须指定默认值

所以可以直接这样调用 Time myTime{12},也就是a为12

这时候不能再有这样的构造函数Time(int a),因为系统不知道你是要哪个

2.单参数构造函数的话,总结一下

Time mytime = {16}; 这种写法一般认为是正常的,带一个参数16,可以让系统明确调用带一个参数的构造函数

Time mytime1 = 16; 这就存在临时对象或者隐式转换的问题,因为这相当于调用单参数构造函数,生成一个临时对象,把临时对象的值,赋值到了mytime1的成员变量里

void func(Time myt)

{

return

}

func(16),这也存在临时对象或者隐式转换的问题

用explicit(显式)就可以强制系统明确要求不能做隐式转换

比如把构造函数都加上后,像这种explicit Time(int hour, int min, int sec);

此时Time mytime2 = {12, 13, 14)报错

而Time mytime3 {12, 13, 14)没有报错,能成功创建对象

这说明一个问题:有了这个等号,就变成了一个隐式初始化(其实是构造并初始化),省略这个等号,变成了显式初始化(也叫作直接初始化)

那这样怎么改上面那三个的代码呢

Time mytime = {16};

Time mytime1 = 16;

func(16)

这样改:

Time mytime = Time(16); //或者Time{16}

func(Time(16)); //临时构造一个对象

总结:一般来说,单参数的构造函数都声明为explicit,除非有特别原因

构造初始化列表

Time::Time(int temphour, int tmpmin, int tmpsec)

:Hour(tmphour), Minute(tmpmin)

尽量不要某个成员变量依赖另一个,比如

Time::Time(int temphour, int tmpmin, int tmpsec)

:Hour(tmphour), Minute(Hour)

因为赋值顺序不是按照这个左右,而是按照成员变量在类的定义顺序

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。