类的引入
C语言中,结构体只能定义变量,但是C++中结构体内不仅可以定义变量,还可以定义函数。
类的定义
C语言中,我们通常使用struct,而C++中我们引入新的关键字class。
class className
{
};
具体的例子
class Person
{
public:
void PrintPersonInfo();
private:
char _name[20];
char _gender[3];
int _age;
};
注意点
我们需要注意的是,类仅仅是一个声名,只有在类创建对象的时候,才会真正的实例化。所以具体的函数,是否内容在类中写出,都可以。 同时也需要避免,在类里直接调用其他类的函数,我们需要明白,声明的含义。
class arr
{
vector<int> arr;
arr.push_back(1);
};
访问限定符
- public修饰的成员在类外可以直接访问
- protected和private修饰的成员在类外不能直接被访问
- 访问权限符作用域从高该访问限定符出现的位置开始到下一个访问限定符出现时为止
- class的默认访问权限为private,而struct的默认访问权限为private
封装
封装本质上是一种管理:我们如何管理兵马俑呢?比如如果什么都不管,兵马俑就被随意破坏了。那么我们首先建了一座房子把兵马俑给封装起来。但是我们目的全封装起来,不让别人看。所以我们开放了售票通道,可以买票突破封装在合理的监管机制下进去参观。类也是一样,我们使用类数据和方法都封装到一下。 不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域内,在类外定义成员,需要利用::作用域解析符号
class Person
{
public:
void PrintPersonInfo();
private:
char _name[20];
char _gender[3];
int _age;
};
void Person::PrintPersonInfo()
{
cout<<_name<<" "_gender<<" "<<_age<<endl; }
类的实例化
类只是模型,告诉我们类里有啥,定义出来的类并没有实际的分配内存空间,只有当类实例化对象以后才能真正意义上的分配空间。
类对象的存储方式
只保存成员变量,成员函数保存在公共代码端 原因非常简单,每个类对象成员变量可能不尽相同,但是成员函数执行一定相同,如果为每个对象单独开辟空间存储成员函数,自然造成了,空间的浪费。
内存对齐
见C语言中内存对齐,原理相同
this指针
class Date
{
public :
void Display ()
{
cout <<_year<< "-" <<_month << "-"<< _day <<endl;
}
void SetDate(int year , int month , int day)
{
_year = year;
_month = month;
_day = day;
}
private :
int _year ;
int _month ;
int _day ;
};
int main()
{
Date d1, d2;
d1.SetDate(2018,5,1);
d2.SetDate(2018,7,1);
d1.Display();
d2.Display();
return 0; }
我们之前说了,类的成员函数是放在公共代码段的,那么对于d1,d2两个不同的对象调用setDate函数,和Display函数,又是如何区分的呢? C++通过引入this指针来解决这个问题。C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this指针的特性
- this指针的类型:类类型* const。
- 只能在“成员函数”的内部使用。
- this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
- this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
void Display()
{
cout<<_year<<endl;
}
void Display(Date* this)
{
cout<<this->_year<<endl;
}
|