侯捷 C++ 课程学习笔记:类的声明与构造函数
目录
一、类的声明
二、内联函数
三、访问级别
四、构造函数
五、构造函数重载
六、实际应用案例
七、学习心得
一、类的声明
类的声明是定义类的基本结构,包括类的成员变量和成员函数。类的声明分为类头和类体两部分。
-
类头(class head):包含类的名称和访问级别。
-
类体(class body):包含类的成员变量和成员函数的声明。
示例代码:
class complex {
public:
complex(double r = 0, double i = 0) : re(r), im(i) { }
complex& operator += (const complex&);
double real() const { return re; }
double imag() const { return im; }
private:
double re, im;
friend complex& __doapl(complex*, const complex&);
};
在上述示例中:
-
public
和private
是访问级别,分别表示公有成员和私有成员。 -
complex
是类的构造函数,用于初始化对象。 -
operator +=
是重载的赋值运算符。 -
real
和imag
是成员函数,用于获取复数的实部和虚部。 -
re
和im
是私有成员变量,用于存储复数的实部和虚部。 -
__doapl
是友元函数,用于实现某些特定的操作。
二、内联函数
内联函数(inline function)是一种特殊的函数,其定义在类体内部。内联函数的定义在类体内部完成,编译器会将其定义为内联函数的候选人。
示例代码:
class complex {
public:
complex(double r = 0, double i = 0) : re(r), im(i) { }
complex& operator += (const complex&);
double real() const { return re; }
double imag() const { return im; }
private:
double re, im;
friend complex& __doapl(complex*, const complex&);
};
在上述示例中,real
和 imag
函数在类体内部定义,因此它们是内联函数的候选人。内联函数的定义在类体内部完成,可以提高函数的执行效率。
三、访问级别
访问级别(access level)决定了类的成员变量和成员函数的访问权限。C++ 中有三种访问级别:public
、protected
和 private
。
-
public:公有成员,可以在类的外部访问。
-
protected:保护成员,可以在类的内部访问,也可以在派生类中访问。
-
private:私有成员,只能在类的内部访问。
示例代码:
class complex {
public:
complex(double r = 0, double i = 0) : re(r), im(i) { }
complex& operator += (const complex&);
double real() const { return re; }
double imag() const { return im; }
private:
double re, im;
friend complex& __doapl(complex*, const complex&);
};
在上述示例中:
-
public
成员函数real
和imag
可以在类的外部访问。 -
private
成员变量re
和im
只能在类的内部访问。
四、构造函数
构造函数(constructor)是类中用于初始化对象的特殊成员函数。构造函数的名称与类名相同,没有返回值,可以重载。
示例代码:
class complex {
public:
complex(double r = 0, double i = 0) : re(r), im(i) { }
complex& operator += (const complex&);
double real() const { return re; }
double imag() const { return im; }
private:
double re, im;
friend complex& __doapl(complex*, const complex&);
};
在上述示例中,complex
是类的构造函数,用于初始化对象。构造函数可以有默认参数,如 double r = 0, double i = 0
。
五、构造函数重载
构造函数可以重载,即一个类可以有多个构造函数,只要它们的参数列表不同。
示例代码:
class complex {
public:
complex(double r = 0, double i = 0) : re(r), im(i) { }
complex() : re(0), im(0) { }
complex& operator += (const complex&);
double real() const { return re; }
double imag() const { return im; }
private:
double re, im;
friend complex& __doapl(complex*, const complex&);
};
在上述示例中,complex
类有两个构造函数:
-
一个带有两个参数的构造函数,用于初始化复数的实部和虚部。
-
一个无参数的构造函数,用于初始化复数的实部和虚部为0。
六、实际应用案例
我们在实际应用中,构造函数的合理使用可以显著提升代码的可读性和可维护性。例如,在创建复数对象时,可以使用构造函数初始化复数的实部和虚部。
示例代码:
complex c1(2, 1); // 使用带参数的构造函数
complex c2; // 使用无参数的构造函数
complex* p = new complex(4); // 使用带参数的构造函数创建指针对象
通过这种方式,可以灵活地创建和初始化复数对象,同时保持代码的简洁性和可读性。
七、学习心得
通过学习侯捷老师的 C++ 课程,我对类的声明、内联函数、访问级别和构造函数有了更深入的理解。特别是对构造函数的重载和内联函数的使用,为后续的面向对象编程打下了坚实的基础。
在实际编程中,合理使用构造函数和内联函数可以显著提高代码的执行效率和可读性。同时,理解访问级别的作用,有助于更好地封装类的内部数据,保护类的成员变量和成员函数。