我们知道C语言是面向过程的编程语言,而C++是面向对象(OPP)的编程语言。
面向对象是一种程序设计范型,也是一种程序开发的方法。而对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装在里面,以提高软件的重要性、灵活性和扩展性。
面向对象程序设计 :
概念:(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。 对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
类(class):
类是C++中的特有的,形似于c语言中的结构体!
类有三大特性:封装、继承、多态
在一个类中,可以分为两种对象。分别是成员变量(数据)和成员函数(函数)
三种访问限定符:
1. public成员可从类外部直接访问,private/protected成员不能从类外部直接访问。
2. 每个限定符在类体中可使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前。
3. 类体中如果没有定义限定符,则默认为私有的。4. 类的访问限定符体现了面向对象的封装性。
类的作用域:
1. 每个类都定义了自己的作用域,类的成员(成员函数/成员变量)都在类的这个作用域内,成员函数内可任意访问成员变量和其它成员函数。
2. 对象可以通过 . 直接访问公有成员,指向对象的指针通过-> 也可以直接访问对象的公有成员。
3. 在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
概念 | 描述 |
---|---|
类成员函数 | 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。 |
类访问修饰符 | 类成员可以被定义为 public、private 或 protected。默认情况下是定义为 private。 |
构造函数 & 析构函数 | 类的构造函数是一种特殊的函数,在创建一个新的对象时调用。类的析构函数也是一种特殊的函数,在删除所创建的对象时调用。 |
C++ 拷贝构造函数 | 拷贝构造函数,是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。 |
C++ 友元函数 | 友元函数可以访问类的 private 和 protected 成员。 |
C++ 内联函数 | 通过内联函数,编译器试图在调用函数的地方扩展函数体中的代码。 |
C++ 中的 this 指针 | 每个对象都有一个特殊的指针 this,它指向对象本身。 |
C++ 中指向类的指针 | 指向类的指针方式如同指向结构的指针。实际上,类可以看成是一个带有函数的结构。 |
C++ 类的静态成员 | 类的数据成员和函数成员都可以被声明为静态的。 |
类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。
定义一个简单的类
成员函数可以定义在类定义内部,或者单独使用 范围解析运算符 :: 来定义。在类定义中定义的成员函数把函数声明为内联的,即便没有使用 inline 标识符。所以您可以按照如下方式定义 Volume() 函数:
也可以在类的外部使用范围解析运算符 :: 定义该函数,如下所示:
需强调一点,在 :: 运算符之前必须使用类名。 调用成员函数是在对象上使用点运算符(.),这样它就能操作与该对象相关的数据,如下所示
类实例化对象
1.类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。
2.一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量。
3.做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑
存在,同样的类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
int main()
{
Box myBox;
myBox.getVolume();
return 0;
}
这里的myBox就是Box实例化出来的对象。
在结构体中计算大小是所有成员的大小之和。而类的大小也是成员变量的大小之和。
所以每个对象的大小为类中所有成员变量的大小之和,当然这里也遵循内存对齐原则。
结构体内存对其规则:
1 . 第一个成员在与结构体变量偏移量为0 的地址处。
2 . 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
//对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
V S中默认的值为8
gcc中的默认值为4
3 . 结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍。
4 . 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
class B
{
char ch;//0 0-7
double d;//8 8 8 8-15
};
这个简单的类,他的大小就是char 和 double的大小,但要满足对齐规则。所以大小就应该是16。
class B
{
char ch;//0 0-7
double d;//8 8 8 8-15
};
class C
{
public:
char a;//0 8 0
BB b; // 16 8 8-23
char c;//24 25-31
};
对于嵌套的类求大小也满足对齐规则,故大小应该为32
在类中有隐含的this指针
1 . 每个成员函数都有一个指针形参,它的名字是固定的,称为t his 指针,t his 指针是隐式的。(构造函数比较特殊,没有这个隐含t his 形参)
2 . 编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作实参传递给成员函数的第一个形参t his 指针。
3 . this 指针是成员函数隐含指针形参,是编译器自己处理的,我们不能在成员函数的形参中添加t his 指针的参数定义,也不能在调用时显示传递对象的地址给t his 指针。
但注意,this指针并不是用户在编写代码时所要写的,而是编译器在处理成员函数时所要做的工作。