二、类什么是类?
类的定义
类的访问限定符
struct和class的区别是什么?
什么是对象?
类的大小如何计算
this指针
2.1什么是类?在C语言中,比如你要定义一个student,可以用struct这一关键字。
struct student { int age;//年龄 int id;//学号 char sex[10];//性别 };
我们可以称struct student是一种自定义类型,让struct student自定义类型创建一个变量s1,我们有的时候需要求该变量的学号,设计一个函数int Get_Id(struct student* p)
struct student { int age;//年龄 int id;//学号 char sex[10];//性别 }; int Get_id(struct student* p) { return p->id; }
但为了保持封装性,C++把对应的函数也放进了struct student类型中。然后我们就把这种包含变量和函数的抽象类型称为类。以后我们会体验到这种把变量和函数封装起来的好处。
struct student { int Get_id(struct student* p) { return p->id; } int age;//年龄 int id;//学号 char sex[10];//性别 };
以上struct student就是一个类,student就是一个类名。
类中的函数我们称为成员函数或成员方法
类中的变量我们称为成员变量或成员属性
2.2类的定义定义一个类,既可以用struct,也可以class,不过以class定义类的人较多。
用struct定义一个日期类
struct Date { void Print()//成员函数或者成员方法 { cout << year << "-" << month << "-" << day << endl; } int year;//成员变量或者成员属性 int month;//成员变量或者成员属性 int day;//成员变量或者成员属性 };
再用class定义一个日期类
class Date { void Print()//成员函数或者成员方法 { cout << year << "-" << month << "-" << day << endl; } int year;//成员变量或者成员属性 int month;//成员变量或者成员属性 int day;//成员变量或者成员属性 };
它们定义类的方式是一模一样的,但它们有什么差别呢?
这需要我们学习类的访问限定符。
2.3类的访问限定符类的访问限定符有public、protected、private
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
public:公有访问限定符,类内和类外都能访问
protected:保护访问限定符,类内能访问,类外不能访问
private:私有访问限定符,类内能访问,类外不能访问
protected和private的区别是什么呢?
这里暂时没有区别,学到继承那一章才能区分。
class Date { public: void Print()//成员函数或者成员方法 { cout << year << "-" << month << "-" << day << endl; } private: int year;//成员变量或者成员属性 int month;//成员变量或者成员属性 int day;//成员变量或者成员属性 };
我们给Print()函数和Inint()函数定为公有,那么它们在类外面也能访问。
但定义为private的成员变量在类外面却不能访问,这就是类外不能访问 。
那什么叫类内能访问呢?
就是Print()函数在类里面,它们访问类里面的所有成员。
2.4struct和class的区别是什么?现在我们能够回答struct和class的区别是什么了。
struct来源于C语言,C++兼容C语言,struct能够作为C语言中结构体去使用,同时C++把struct升级成了类,可以和class一样用来定义类,但它们的默认访问限定符是不同的,struct的默认访问限定符是public,而class的默认访问限定符是private。
2.5什么是对象?简单来说,由类定义出来的变量叫做对象,只不过C语言中更愿意叫做变量,C++中把它称作对象。
2.6类的大小如何计算c语言中结构体只有变量,C++中类既有变量又有函数,那么怎么计算类的大小呢?
需要知道的是类的大小不考虑成员函数,因为成员函数都放在公共的代码区域。
那要考虑内存对齐吗?
答:类大小的计算,需要考虑内存对齐。
需要注意的是空类对象的大小是1字节.
为什么呢?
因为如果用空类去定义一个对象,那么不同空类定义出来的对象如何区分呢?
不同空类定义的对象,它们的地址肯定是需要不一样的,因此给1字节是为了占位,起标识作用。
还需要考虑一下,静态的成员变量,静态成员变量在静态区,属于所有类共享,不属于单独类,因此静态成员变量不在类中,不需要计算它的大小。
总结:类的大小只需要考虑非静态的成员变量。成员函数和静态成员变量都是共享一份。
2.7this指针this指针是在传参给成员函数时,编译器会自动传对象的地址过去,而this指针就指向该对象。
class Date { public: void Print()//成员函数或者成员方法 { cout << year << "-" << month << "-" << day << endl; } void Inint(int year,int month ,int day) { year = year; month = month; day = day; } private: int year;//成员变量或者成员属性 int month;//成员变量或者成员属性 int day;//成员变量或者成员属性 };
Inint函数中year和函数的参数重名,那么这样能正确的初始化成员变量吗?
答:不能,编译器不能正确识别哪个是成员变量的year,这里的year=year,该编译器把两个year都认作函数参数。
处理方法有三种:
第一:该形参名
将Inint(int year,int month, int day)改成Inint(int y,int m,int d)
第二:该成员变量名
改为
推荐这种写法
第三:显示指定成员变量
加类域:
使用this指针
this指针其实就在成员函数的参数中,只不过编译器默认给你传了对象的地址给this指针
但我们不能显示的在成员函数的参数中带上this指针,不然会报错。
2.8声明和定义class Date { public: void Print()//定义 { cout << year << "-" << month << "-" << day << endl; } void Inint(int year,int month ,int day)//定义 { this->year = year; this->month = month; this->day = day; } private: int year;//声明 int month;//声明 int day;//声明 };
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)