类和对象的初步认识:
类是对象的抽象,对象是类的具体实例。因为类是抽象的,所以类不占用内存,而对象是具体的,占用存储空间。
我们都知道,C语言时面向过程的语言,它关注的是过程中的数据与方法。
C++是面向对象的语言,它关注的是对象的属性与功能
用一张图来理解类和对象
我们知道了类其实就是一种抽象概念,那么在C++中,怎么引入类
我们已经知道在C语言中可以定义结构体,结构体中可以放各种类型的变量,也可以嵌套结构体。
那么在C++中,我们的结构体不仅可以定义变量,也可以定义方法(也就是函数)。这样的结构体,在C++中就被称为类
struct Student
{
char _name[20];
char _gender[3];
int _age;
void SetStudentInfo(const char *name,const char *gender,int age)
{
strcpy(_name,name);
strcpy(_gender,gender);
_age = age;
}
};
int main()
{
Student s;
s.SetStudentInfo("Peter","男",18);
return 0;
}
像上面这样的结构体,在C++中更喜欢用class来代替。
那么类该怎么定义。
class className
{
//类体:由成员函数和成员变量组成
}; //和结构体类似,一定要有分号
class为定义类的关键字,className为类名,{}中为类的主体,注意最后的分号;
类中的元素称为类的成员,类中的数据称为类的属性或者叫类的成员变量,类中的函数叫做类的方法或者类的成员函数
定义一个简单的类:
class Person
{
public:
//显示基本信息
void showinfo();
public:
char *_name;
char *_sex;
int _age;
};
类有两种定义方式:
1.类的声明和定义全部放在类体中;
2.类的声明放在 .h 文件中,类的定义放在 .cpp文件中(这就好像是C语言中的函数的声明,我们通常把函数的声明放在头文件中,把函数的定义放到 .c文件中)
类的访问限定符及封装
类有三种访问限定符:public(公有)、protected(保护)、private(私有)
说明:
1.public成员可以在类外直接进行访问
2.protected和private成员在类外不能够访问
3.它们的作用域从该访问限定出现的位置到下一个访问限定符出现为止
4.类中如果没有访问限定符,则默认为private
5.struct为public型(因为要兼容C语言)
注意的是:访问限定符只有在编译的时候有用,一旦当数据映射到内存后,没有任何访问限定符上的区别。
我们知道,当我们把一些变量放到private下,那么我们在类外就无法直接访问这些变量,这就产生了一个封装的概念:
封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作符的方法进行有机结合。
类的作用域:
类定义了一个新的作用域,类的所有成员都必须处在类的作用域中。
在类外定义成员,需要用::作用域解析符指明成员属于哪个类域
在类的作用域外,只能通过对象(或指针)借助成员访问操作符 . 和 -> 来访问类成员
前面我们说过,类只是抽象的概念,它不占存储空间,只有实例化出对象,才有真正的存储空间。举个简单的例子:
类就好比房子的设计图纸,它只是构造出了房子的具体框架。对象则是依据设计图纸修剪出的具体的房子,这样的房子可以不止一个,
所以类可以实例化出很多的对象。
类只是一个模型一样的东西,限定了有哪些成员,定义出了一个类但是并没有分配实际的内存空间来存储
一个类可以实例化出很多个对象,实例化出的对象,占用实际的物理空间来存储类成员变量
代码举例:
class Person{
public:
void showInfo()
{
cout<<_name<<"_"<<_sex<<"_"<<_age<<endl;
}
public:
char *_name;
char *_sex;
int _age;
};
void Test()
{
Person man;
man._name = "jack";
man._sex = "男";
man._age = 10;
man.showInfo();
}
前面说过类和结构体很相似,那么类的大小的算法是不是也和结构体很相似呢?
其实,类的大小就是类中成员变量之和,当然,计算时,也要遵循内存对齐(这里要说明的一点:空类的大小是1,因为这个类比较特殊,因此编译器个了空类一个字节来标识这个类)
来复习下内存对齐的规则:
1.第一个成员在与结构体偏移量为0的地址处
2.其他成员要对齐到某个数字(对齐数) 的整数倍的地址处。(对齐数 = 编译器默认的一个对齐数与该成员大小的较小值,VS环境下默认为8,gcc中默认为4)
3.结构体总大小为最大对齐数的整数倍
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍。
类的this指针
每个成员函数都有一个指针形参,它的名字是固定的,叫作this指针,this指针是隐式的。
编译器会对成员函数进行处理,在对象调用的的时候,对象地址作实参传递给成员函数的第一个形参this指针。
this指针是成员函数隐含指针形参,是编译器自己处理的,我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用时,显示传递对象的地址给this指针。