类成员的访问控制
在C++中,类成员(包括成员变量和成员函数)可以定义不同的访问级别:
public
:公有成员,可以在类的内部和外部被访问。private
:私有成员,只能在类的内部被访问,类的外部无法直接访问。protected
:保护成员,在类的内部和派生类中可以访问,但在类的外部无法访问。
面向对象程序设计方法
面向过程程序设计
- 特点:用户需求简单而固定,通过分析解决问题所需要的步骤,利用函数实现各个步骤,并依次调用函数解决问题。
- 问题:软件可重用性差,软件可维护性差。
面向对象程序设计
- 核心:由现实世界建立软件模型,通过属性和方法来描述现实世界中的事物。
- 特点:直接分析用户需求中涉及的各个实体,在代码中描述现实世界中的实体,并关联各个实体协同工作解决问题。
- 优势:构建的软件能够适应用户需求的不断变化。
面向对象三大特征
- 封装:将变量(属性)和函数(操作)合成一个整体,封装在一个类中,尽可能隐蔽对象的内部细节,只保留有限的对外接口。
- 继承:允许我们根据一个类(基类或父类)来定义另一个类(派生类或子类),派生类继承了基类的属性和方法,并可以添加新的属性和方法或重写已有方法。
- 多态:允许将子类对象当作父类对象来使用,一个接口多种实现,实现接口的多样化。
构造函数定义
- 定义:与类名相同的特殊成员函数,用于初始化对象。
- 特点:可以有参数,也可以没有参数;没有返回类型(连
void
都没有);可以重载。
无参构造函数
class Animal {
public:
char name[20];
int age;
// 无参构造函数
Animal() {
cout << "Animal()" << endl;
}
};
// 调用时机
Animal a, b;
Animal x[4];
// 注意:Animal a(); 这不是构造对象,而是声明了一个返回Animal类型的函数a,不接受参数。
有参构造函数
class Animal {
public:
char name[20];
int age;
// 无参构造函数
Animal() {
cout << "Animal()" << endl;
}
// 有参构造函数
Animal(const char* n, int a) {
strcpy(name, n);
age = a;
cout << "Animal(" << name << ", " << age << ")" << endl;
}
};
// 调用时机
Animal c("Dog", 3);
初始化成员列表
- 初始化成员列表用于在构造函数体执行之前初始化成员变量。
- 适用于引用成员、const成员以及需要调用构造函数的类类型成员。
class Box {
private:
int length, width, height;
public:
// 使用初始化成员列表
Box(int x, int y, int z) : length(x), width(y), height(z) {
cout << "Box(" << x << ", " << y << ", " << z << ")" << endl;
}
};
总结
- 构造一个对象时会自动调用一个构造函数。
- 如果一个类中没有定义任何构造函数,编译器会生成一个默认的无参构造函数(前提是没有定义其他构造函数)。
- 如果类中定义了带参数的构造函数,而没有定义无参构造函数,那么在尝试不带参数构造对象时会编译失败。
- 构造函数可以重载,根据构造对象时所传递的参数,会自动调用对应的构造函数。
- 类本身不占用程序的内存空间,只有类的实例(对象)才会占用内存空间。