基于对象的编程风格
构造函数与析构函数
C++提供了构造函数来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,构造函数不需要用户来调用它,而是建立对象时自动执行。
构造函数的函数名称必须与类名相同。构造函数没有返回值类型,不返回任何值。
一组重载的构造函数
class Triangular{
public:
//一组重载的构造函数
Triangular();
Triangular(int len);
Triangular(int len, int beg_pos);
//...
};
类对象被创建时,编译器会自动根据获得的参数,挑选出应被调用的构造函数:
- Triangular t; 会调用默认的构造函数;
- Triangular t1(10,3); 会调用带有两个参数的构造函数;
- Triangular t2=3; 会调用带有单一参数的构造函数;
- Triangular t5(); 此行将t5定义为一个函数,参数列表为空;因为C++必须兼容于C;
Triangular(int len =1, int bp=1);同样也是默认构造函数,为每个参数提供了默认值。
修饰符const和mutable
在 C/C++ 语言中,const关键字是一种修饰符。所谓“修饰符”,就是在编译器进行编译的过程中,给编译器一些“要求”或“提示”,但修饰符本身,并不产生任何实际代码。就 const 修饰符而言,它用来告诉编译器,被修饰的这些东西,具有“只读”的特点。在编译的过程中,一旦我们的代码试图去改变这些东西,编译器就应该给出错误提示。
常见const的用法
- const 变量,指的是此变量的值是只读的,不应该被改变,const 变量必须被初始化;
- const 类对象 不能改变 const 类对象的任何成员变量,const类成员不可以调用non-const成员函数;
class CDebugModule
{
public:
CDebugModule() {};
~CDebugModule() {};
public:
int m_debugLevel;
public:
void SetDebugLevel(int debugLevel) { m_debugLevel = debugLevel;};
void PrintDebugLevel(void) { cout << m_debugLevel;};
void PrintDebugLevel_const(void) const { cout << m_debugLevel;}; // const 类成员函数
};
int main( int argc, char *argv[])
{
const CDebugModule debug;
debug.m_debugLevel = 10; // 编译出错:不能直接改变成员变量
debug.SetDebugLevel(20); // 编译出错:不能通过成员函数改变成员变量
debug.PrintDebugLevel(); // 编译出错:不能调用非 const 成员函数
debug.PrintDebugLevel_const(); // 正常
return 0;
}
- 指向const 变量的指针
指的是一个指针指向一个const变量的地址。
const int debugLevel = 10;
const int logLevel = 10;
const int *p = &debugLevel;
p = &logLevel; // 正常,指针的指向可以改变
*p = 10; // 编译错误,指针指向的位置是只读的
- const 指针 指针的指向一经确定,不能改变。指针指向的内容,可以改变。
int logLevel = 10;
int logId = 0;
int * const p = &logLevel;
int * const q; // 编译错误,未初始化 const 变量(这个错误是否报告,和所用的编译器有关)
*p = 5; // 正常,const指针指向内容可以改变
p = &logId // 编译错误,const指针自身内容(指向)不能改变
- const 变量作为函数参数
类的静态成员
静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化。
class A{
private:
static int objectCount;
public:
//...
};
int A::objectCount=0;
静态成员函数
- 静态成员函数即使在类对象不存在的情况下也能被调用,静态函数只要使用类名加范围解析运算符 :: 就可以访问。
- 静态成员函数没有this指针,只能访问静态成员数据、其他静态成员函数和类外部的其他函数。
参考文档:
C++ 构造函数总结 https://blog.csdn.net/chaipp0607/article/details/71525599
C/C++中const修饰符的用法总结
https://blog.csdn.net/yudejiao/article/details/53291562