1.基本的概念
类,指的是莫一类的事物的概括,是一个抽象的
对象:指的是某一类里面的一个实体,是具体的
类:
通常包含了属性和行为。属性:被描述类的静态的特征,老虎的颜色、体重等静态的属性;行为:描述类的动态特征,比如跑
类的继承:
继承之后的类,继承了原先的类的所有的属性和行为;继承之后的类,也可以有自己特有的属性和行为:
在类A的基础上建立一个新类B,类A成为基类或者父类,类B成为派生类或者子类;子类完全继承父类的所有的成员。
class 子类名字 : 继承的方式 父类的名字 { } 继承的方式:public /private/protected,如果省略的话,系统默认的是 private
2.类的封装
类的封装就是将不同的属性和行为结合在一起,形成一个新的数据类型。
成员变量:表示类的属性
成员函数:表示类的行为的函数,
分为:共有、私有、保护 三种类型
公有:成员变量和成员函数可以被类内和外界访问和调用,也就是共有的成员可以通过变量被外接访问
私有:成员变量和成员函数只能被类的内部访问和调用,也就是说 私有的成员只能在类的内部使用
3.struct 和 class 区别:
struct 定义类的时候,所有的成员默认的都是 public
class定义类的时候,所有的成员默认的都是私有的
4、构造函数
构造函数的作用是完成,类的对象初始化,他的名字和类名完全一致,可以有参数,但是必须没有任何的返回值
class Test { public: Test(int v); // 构造函数 ~Test(); int getValue(); private: int i; }; Test::Test(int v) // 构造函数 { i = v; } Test::~Test() { } int Test::getValue() { return i; } int main(int argc, char **argv) { Test aa(5); // 对象的初始化 Test bb = 5; // 对象初始化的方式2 Test cc = Test(6); // 主动调用构造函数 printf("v = %d\n", aa.getValue()); }
类的成员函数实现重载:
C++中函数可以实现函数的重载,构造函数其实也是可以实现重载的功能的:
class A { private: int i; public: A() // 重载 { i = 11; } A(int v) // 重载 { i = v; } int getvalus() { return i; } };
显然,类的对象定义的时候,即使你没有进行初始化,编译器还是会自动完成对象的初始化,
构造函数的异类:
默认构造函数、拷贝构造函数(完成对象的拷贝的任务)
A aa; // 调用默认的构造函数,无参 A bb = aa; // 调用拷贝构造函数
数
当类内自己没有定义构造函数和拷贝构造函数的时候,编译器会为你自动添加一个无参的构造函数,其函数体为空。而默认提供的拷贝构造函数,也只是简单的进行成员变量的值复制。
当类A的对象是类B的成员变量的时候:初试列表的使用
class A { private: int i; public: A(int v) { i = v; } }; class B { public: B() { printf("BB\n"); } private: const int c; // const 变量必须初始化 A a1; // 对象也是需要进行初始化 A a2; };
这个时候,会被报错,因为A的对象在B做成员的变量,压根就没有被初始化,所以在B内部需要给成员变量初始化,初始化列表:
class B { public: B() : c(1), a1(2), a2(3) // 构造函数里面,指定初始化的值,初始化列表 { printf("BB\n"); } private: const int c; A a1; A a2; };
也就是说,通过初始化列表,对成员变量进行初始化,并且初始化列表的执行是先于构造函数的函数体执行的;也就是使用初始化列表对构造函数进行成员变量的初始化,
5.析构函数
就是在对象被销毁之前调用的析构函数(完成一些清理的工作),析构函数没有参数,也没有任何的返回值类型
~ 类名() { }
当自己没有写构造函数或者析构函数的话,编译器会自动为我们添加构造函数和析构函数。
构造函数当且仅当只有一个。析构执行的调用顺序与对应的构造函数调用秩序相反。