类和对象
C++是一门基于面向对象的编程语言
类是C++中引入的概念,类就是对现实中一类具有共同特征事物的抽象.类是一种特殊的结构体,C语言中结构体只能用来定义变量,而C++中还可以用来定义函数,在C++中用关键字class来代替
对象:类的实例叫做对象
struct Student
{
void SetStudentInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintStudentInfo()
{
cout << _name << " " << _gender << " " << _age << endl;
}
char _name[20];
char _gender[3];
int _age;
};
int main()
{
Student s;
s.SetStudentInfo("Tom", "男", 18);
return 0;
}
类的定义
class classname{
//类体-->成员变量,成员函数
}; //类定义结束时必须加分号
类的定义方式:
- 将类的声明和定义全部放在类中—>成员函数默认为内联函数
- 将类的声明放在头文件中,定义放在源文件中(成员函数在类外定义,函数名前必须加类的名字和作用域限定符)
//.h文件
class person{
public:
void InitPerson(char* name, char* gender, int age);
void PrintPerson();
private:
char _name[20];
char _gender[3];
int _age;
};
//.cpp文件
void person::InitPerson(char* name, char* gender, int age){
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void person::PrintPerson(){
cout << _name << '-' << _gender << '-' << _age;
}
访问权限:
- public:类内的成员在类外可以直接被访问
- private/protected:修饰的类成员不能直接在类外被访问
class默认访问权限是private
struct默认访问权限是public
封装:
将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互
C++中采用类来实现封装,利用类的访问权限将接口提供给外部用户
类的作用域:
类定义了一个新的作用域,类的所有成员都在类的作用域中
在类外定义成员,需要使用作用域限定符::来指明成员所属区域
类的实例化:
类是一种抽象,即类是是一种和模型差不多的东西,定义了类里有哪些成员,定义好一个类并没有分配到实际的内存空间来存储.在实例化的时候才会对实例化的对象分配存储空间
类就像是造房子的图纸,而对象是实实在在的房子,类可以有多个实例化对象
int main(){
person a,b,c;
a.InitPerson("Tom", "男", 20);
a.PrintPerson();
b .InitPerson("Toom", "男", 21);
b.PrintPerson();
c.InitPerson("Tooom", "男", 22);
c.PrintPerson();
return 0;
}
类对象的大小:
类中虽然定义了成员变量和成员函数,但是因为类的实例化每次调用的成员函数是同一份函数,所以类对象中只保存了成员变量,把成员函数放在公共的代码段
类的大小计算和结构体大小计算一样:
类的大小=类内成员变量的大小相加+内存对齐
空类的大小=1(在主流编译器下是1,用来区分类实例化的对象是不同的对象)
class A{
public:
int ADD(int left, int right){
return left + right;
}
private:
int a;
char b;
};
class B{
};
int main(){
cout << sizeof(A) << ' ' << sizeof(B); //sizeof(A)=8;sizeof(B)=1
return 0;
}
this指针
从类的定义,我们可以看出类的成员函数中并没有定义用来将两个对象的区分的部分,那么每次在创建对象的时候,类是怎么来区分该创建那个对象呢?
其实,C++编译器悄悄的给每个成员函数增加了一个隐藏的指针,这个指针指向当前的对象,在函数体内所有成员变量的操作,都是通过这个指针来完成的.用户不需要来传递这个指针,编译期自动完成
这个指针就是this
this指针的特性:
- this指针的类型:类类型* const
- 只能在“成员函数”的内部使用
- this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
- this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递
this指针可以为空,但有可能会是程序崩溃,即如果涉及到类成员变量的访问则会崩溃