C++中可以使用structclass来定义一个类

上述代码中person对象,pPerson指针的内存都是在函数的栈空间,自动分配和回收。

structclass的区别:struct的默认成员权限是publicclass的默认成员权限是private。实际中用class表示比较多。

构造函数

构造函数(也叫构造器),在对象初始化的时候调用,一般用于完成对象的初始化工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Person {
public:
int age;

// 构造函数
Person(){
this->age = 0;
}

// 自定义构造函数
Person(int age) {
this->age = age;
}
};

函数名与类同名,无返回值(void都不能写),可以有参数,可以重载,可以有多个构造函数。
一旦自定义了构造函数,必须用其中一个自定义的构造函数来初始化对象。

析构函数

析构函数(也叫析构器),在对象销毁的时候自动调用,一般用于完成对象的清理工作。

1
2
3
4
5
6
7
8
9
class Person {
public:
int age;

// 析构函数
~Person(){

}
};

函数名以~开头,与类同名,无返回值(void都不能写),无参,不可以重载,有且只有一个析构函数。
注意点:

  • 通过malloc分配的对象free的时候不会调用构造函数。
  • 构造函数、析构函数要申明为public,才能被外界访问。

声明和实现分离

在项目开发中,编写的类都是分头文件与实现文件,C++也不例外。

成员的访问权限

C++对象成员范文权限三种:publicprotectedprivate

权限修饰符 访问权限
public 公共的,任何地方都可以访问
protected 子类内部、当前类内部可以访问
private 私有的,只有当前类的内部可以访问

继承

C++类可以存在继承,可以让子类拥有父类的所有成员(变量\函数)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>

using namespace std;

class Person {

public:
int m_age;

void run() {
cout << "void run()" << endl;
}
};

// class定义的类 默认是私有继承
class Student : public Person {

public:
int m_no;
void study() {
cout << "Student::Study()" << endl;
}
};

上面的Student是子类(subclass,也叫派生类)。Person是父类 (superclass,超类)。
C++与其它的编程语言有些不同,不存在基类。

C++继承是可以设置继承的权限,也就是说子类继承父类后成员权限。

开发中最多的集成方式是public,这样能保留父类原来的成员访问权限。

Student继承Person,当初始化一个Student对象时,内部的成员布局是父类的成员在前,子类的成员在后。

初始化列表

初始化列表是一种便捷的初始化成员变量的方式。只能用在构造函数中并且初始化的循序只跟成员变量的声明顺序有关。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>

using namespace std;

class Person {

public:
int m_age;
int m_height;
/*
// 传统的自定义构造方法写法
Person(int age, int height) {
this->age = age;
this->height = height;
}
*/

// 初始化列表默认做法
Person(int age, int height):m_age(age), m_height(height){

//m_age = age;
//m_height = height;
}
};

通过汇编指令可以看出初始化列表只是语法糖,并没有什么性能提升,只是简单的编译器特性。

在C++构造函数如果想互相调用必须使用初始化列列表的方式

如果是函数声明和实现是分离的,初始化列表只能写在函数的实现中。