C++是一个面向对象的编程语言,而面向对象编程有四大特性:封装,抽象,继承,多态。类和对象就是对应其中的封装,在C++中将数据和对数据的操作都封装在一个class(类)的结构体中。
目录
类的定义:
访问限定符:
类域:
对象实例化:
对象的大小:
*this指针:
类的定义:
1.class为类的关键字,类名可以自己定,{};中为类的主体,在类体中的内容称为类的成员:类中定义的变量可以称为成员变量或类的属性,类中定义的函数被称为成员函数
2.C++中也可以使用struct定义类,C++兼容C中struct的用法,同时也可定义类,明显的变化就是struct中可以定义函数,但一般还是使用class定义类(两者还是有那么一丢丢小差别)
3.定义在类里的函数默认是内联函数(inline)
注意:
(1) 不管是class还是struct,{}的尾巴上的分号不能省略
(2) 如果不想将成员函数变成内联函数只要将函数的声明和定义分离开即可
class arr
{
public:
int _z = 0;
arr(int x=0,int y=0)
{
_x = x;
_y = y;
cout << "arr(int x,int y)" << endl;
}
//声明
void add();
private:
int _x;
int _y;
};
//定义
void arr::add()
{
cout << _x + _y << endl;
cout << "add()" << endl;
}
访问限定符:
1.C++一种实现封装的方式,用类将对象的属性结合在一起,使得对象更加完善,通过访问权限可以选择性的开发接口给外部的用户使用
2.在上面的代码中使用public(公共)修饰的成员可以在类外面直接访问,而private(私有)则不行但成员函数可以访问,protected和private是⼀样的,但以后继承章节才能体现出他们的区别
3.访问权限的作用域在一个访问限定符出现后直到下一个访问限定符出现为止,都是属于该限定符属性的成员函数或成员变量,直到};也就是类的结束为止
4.类里没有定义访问限定符的情况下,class默认是私有(private),struct默认是共有(public)
5.一般成员变量都会被限制为private/protected,需要给别人使用的成员函数会为public
调用上面的代码(用vs编译器示范):
可以看到我无法访问私有的成员,但是放在public(公有)的add函数和_z变量可以直接访问
类域:
1.定义类和定义一个命名空间一样都会产生域,也称为类域,在类外定义成员时,需要使用::作用域操作符来表示该成员属于哪个域
2.类域和命名空间都是影响编译的查找规则,如果不表明该成员属于哪个域,编译器不会进到域里面查找,那么编译时就会报错。用::作用域操作符指明成员属于哪个域后在编译器知道了它是成员函数,在当前域中找不到就会进到类域里面去找
class arr
{
public:
arr(int x=0,int y=0)
{
_x = x;
_y = y;
cout << "arr(int x,int y)" << endl;
}
//声明
void add();
private:
int _x;
int _y;
};
//定义
//使用::声明是哪个类域
void arr::add()
{
cout << _x + _y << endl;
cout << "add()" << endl;
}
int main()
{
arr a1(2,3);
a1.add();
return 0;
}
对象实例化:
类和对象,那么对象是什么,类就好比是一张房子图纸,它只能告诉你该怎么建,但建出来房子并不是图纸而是人,而建出来的房子过程就是对象实例化
1.用类类型在物理内存中创建对象的过程就是类实例化出对象
2.类是对象的一种抽象描述,它就只是限定了类的有哪些成员变量,但是!它们就仅仅只是声明,在没有实例化之前是不开空间的
3.一个类可以实例化多个对象,每个实例化的对象都各自占用实际空间
注意:类里面的成员函数只是被类域所限制了,实例化对象后,如果成员变量没有进行初始化但通过成员函数调用访问会出现随机数
对象的大小:
类实例化出的每个对象,都是独立的空间,所以对象大小肯定包含成员变量,那么问题来了,成员函数也会包含其中吗?首先函数被编译后是一段指令,对象中没法储存,这些指令储存在单独的区域(代码段),如果硬要储存的话就只能储存函数指针,但是真的有必要储存指针的必要吗?如果要实例化100个对象,那每个对象就都要存一次函数指针,这样就太麻烦了,所以对象的大小并不包含函数
注意:C++中类实例化的对象也要符合内存对齐的规则,如果类的定义中没有设立变量,那么这个对象的大小是1字节表示这个对象存在
*this指针:
1.*this指针是成员函数中特有的指针,编译器在编译后,类的成员函数默认都会在形参的第一个位置增加一个当前类型的指针也就是*this指针,用上面的add函数作示例,它的真实原型是:void add(arr*const this)
2.类的成员函数中访问成员变量本质都是通过*this指针访问的,就像上面代码的_x + _y,本质是:this->_x+this->_y;
3.C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针
class arr
{
public:
arr(int x=0,int y=0)
{
_x = x;
_y = y;
cout << "arr(int x,int y)" << endl;
}
void add()//this指针不显示
{
cout << _x + _y << endl;
cout << "add()" << endl;
}
private:
int _x;
int _y;
};
本篇文章到这里就结束了,希望本篇能够对刚接触到类和对象的读者提供帮助,谢谢你的阅读