类的引入
由于内容十分之多所以类和对象我将分成三期去讲解
在C语言中,描绘一类对象的的属性时,我们会使用结构体,在结构体重定义该对象的特征,如一个学生。
struct student
{
char name[20];
int age;
char sex[10];
//...
};
而在C++中,引入了类这个概念。
类是一种用户自定义的数据类型,它可以包含数据成员和成员函数。数据成员是类的属性,描述了类的特征;成员函数是类的行为,描述了类的操作。类可以看作是一个模板,它定义了对象的结构和行为。
简单来说就是功能更加强大的升级版结构体。
类的关键字:class
class student {
int age;
char name[20];
char sex[10];
//...可以添加成员函数和成员变量
};
访问限定符
类的成员可以用访问限定符设置属性:public(公有),private(私有),protected(保护)
公有属性的成员可以从外界访问,而私有和保护属性的成员不能从外界访问(目前两者差别暂不区分以后再讲)。
展示:
class student {
public:
int getage()//访问权限作用域从该访问限定符出现的位置开始
//直到下一个访问限定符出现时为止即从public到private之间全部都是共有的
{
return age;
}
private:
int age;
char name[20];
char sex[10];
};
int main()
{
student a = {0,0,0};
cout << a.age;
return 0;
}
这样写程序会报错,因为age是私有属性的成员,所以不能够从外界访问。
class student {
public:
int age;
char name[20];
char sex[10];
};
int main()
{
student a = {0,0,0};
cout << a.age;
return 0;
}
这样写就不会有任何问题。(内部默认是私有权限所以记得public)
对象是类的实例化,是类的具体实体。通过创建对象,可以使用类的属性和操作。对象可以访问类中的公有成员函数和公有数据成员。
类的大小
类是一种构造类型,大小的计算方法和struct一样,需要字节对齐。
成员函数是不占空间的,所以不需要计算成员函数的大小。(如果类没有成员变量那么编译器就会给空类一个字节来唯一标识这个类的对象即大小为1字节)。
如下:
class studenta {
int _age;
char _name[20];
char _sex[10];
};
class studentb {
public:
int getage()
{
return _age;
}
int _age;
char _name[20];
char _sex[10];
};
class studentc {
public:
int getage()
{
return 1;
}
};
int main()
{
studenta a ;
studentb b ;
studentc c ;
cout << sizeof(a)<<" "<<sizeof(b)<<" "<<sizeof(c);
return 0;
}
按照刚才的逻辑输出的结果就应该如下:
(36的由来:首先age是int占4个字节,此时的对齐数为4,然后name占20个字节,然后sex占10个字节,加起来是34不是4的倍数所以要对齐变为36,实在不知道怎么算的可以去看我之前讲结构体的博客)
this指针
this是一个关键词,是一个(类的名字)*const的指针,在类的成员函数中,每个成员函数都有一个隐藏的参数,就是this指针指针指向当前对象(函数运行时调用该函数的对象)。如下:
class studenta {
public:
int getage()//首先这里隐藏了一个参数 studenta* this
{
return _age;//这里看上去是_age实际上编译器会自动在其前面加上this指针等价于this->_age
//在每一个成员函数体内所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成
}
int _age;
char _name[20];
char _sex[10];
};
this指针的特性:
1,不能给this指针赋值(因为有const属性)。
2,this指针本质上其实是一个成员函数的第一个形参,是对象调用函数时,将对象的地址作为实参传给this指针,,所以对象中不存储this指针。
3,this指针存放在栈上(因为是形参,形参们都存放在栈上)
4,只能在成员函数内部使用
5,this 指针可以为空,我们可以在类外部定义一个类类型指针,将该指针初值为空 ,然后将其作为实参传入this指针形参中。如下:
class studenta {
public:
int getage()
{
return 1;
}
int age;
char name[20];
char sex[10];
};
int main()
{
studenta* a = NULL;
cout << a->getage();
return 0;
}
这个程序输出的结果为1,当this指针为空时,如果成员函数没有调用成员变量,那么代码不会崩溃,否者代码就会崩溃。如果我把返回值变为_age那么程序就会崩溃。
小结
本次我们简单的先带大家把类和对象入个门,下一期再继续深入讲解C++的类和对象,如果觉得博主讲的不错的话请关注博主给一个免费的点赞和收藏吧!我们下期再见!