面向过程和面向对象的初步认识
C语言是面向过程:通过函数逐步解决问题。
C++是面向对象,把一件复杂的事情交给不同的对象完成
类的引用
在C语言中,结构体中只能定义变量,但在C++中,结构体内不仅可以定义变量,还可以定义函数。
例如:
struct Test {
//成员变量 int a; double b;
//成员函数 int Add(int x, int y) { return x + y; }
};
类的定义
class className
{
//类体:由成员变量和成员函数组成
}; //注意后面的分号
其中class类为关键字,class Name为类的名字;
类里面的变量叫成员变量,类里面的函数叫成员函数
类的定义方式:
声明和定义全部放在类体中。需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理
题外话(什么是内联函数呢)
内联函数是在 C++ 中增加的一个功能,可以提高程序执行效率。如果函数是内联的,编译器在编译时,会把内联函数的实现替换到每个调用内联函数的地方,可以与宏函数作类比,但宏函数不会进行类型检查。
类的访问限定符及类的封装
类的访问限定符
C++实现封装的方式:用类将对象的属性和方法结合在一块,让对象更加完善,通过访问权限,选择性的将其接口提供给外部的用户使用。
访问限定符包括:private(私有,只能在类里面使用),public(可以在类外面使用),protected和private修饰的成员在类外不能直接被访问。
访问权限从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
class的默认访问权限为private,struct为public
类的封装
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互
封装本质上是一种管理,我们使用类将数据和方法都封装起来。不想对外开放的就用 protected/private 封装起来,用 public 封装的成员允许外界对其进行合理的访问。所以封装本质上是一种管理。
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用“::”作用域解析符指明成员属于哪个类域
class Person
{
public:
//显示基本信息
void ShowInfo();
private:
char* _name; //姓名
char* _sex; //性别
int _age; //年龄
};
//这里需要指定ShowInfo是属于Person这个类域
void Person::ShowInfo()
{
cout << _name << "-" << _sex << "-" << _age << endl;
}
每个类都有单独作用域,需要访问限定符才能访问.
类的实例化
用类类型创建对象的过程,称为类的实例化。
1、类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。
就像C语言中定义了一个结构体一样,当你还未用该自定义类型创建变量时,定义结构体类型这个过程并没有分配实际的内存空间来存储它。
2、一个类可以实例化出多个对象,实例化出的对象将占用实际的物理空间来存储类成员变量。
就像你在C语言中定义了一个结构体,然后用该自定义类型创建了一个变量,那么这个变量将占用实际的物理空间来存储其成员变量。
3、类实例化出对象就像现实中使用建筑设计图建造出房子,类就是设计图。
类对象模型
在类中既有成员变量,也有成员函数,如何计算类的大小呢
//只有类的成员变量 //只有类的成员函数 //既有类的成员函数也有成员变量
class A1 class A2 class A3
{ { {
private: public: public: void f1(){}
int a; void f1(){ private: int a;
} } }
通过sizeof计算可以看出A1为4字节,A2为1字节,A3为4字节
说明如果只有一个成员函数或者空类的时候,系统会自动分配一个字节