Essensial C++ 基于对象的编程风格

构造函数与析构函数

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的用法

  1. const 变量,指的是此变量的值是只读的,不应该被改变,const 变量必须被初始化;
  2. 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;
}
  1. 指向const 变量的指针
    指的是一个指针指向一个const变量的地址。
const int debugLevel = 10;
const int logLevel = 10;
 
const int *p = &debugLevel;
p = &logLevel;    // 正常,指针的指向可以改变
 
*p = 10;          // 编译错误,指针指向的位置是只读的
  1. const 指针 指针的指向一经确定,不能改变。指针指向的内容,可以改变。
int logLevel = 10;
int logId = 0;
 
int * const p = &logLevel;
int * const q;               // 编译错误,未初始化 const 变量(这个错误是否报告,和所用的编译器有关)
 
*p = 5;                     // 正常,const指针指向内容可以改变
p = &logId                  // 编译错误,const指针自身内容(指向)不能改变
  1. const 变量作为函数参数

类的静态成员

静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化。

class A{
private: 
    static int objectCount;
public:
    //...
};
int A::objectCount=0;

静态成员函数

  1. 静态成员函数即使在类对象不存在的情况下也能被调用,静态函数只要使用类名加范围解析运算符 :: 就可以访问。
  2. 静态成员函数没有this指针,只能访问静态成员数据、其他静态成员函数和类外部的其他函数。

参考文档:
C++ 构造函数总结 https://blog.csdn.net/chaipp0607/article/details/71525599
C/C++中const修饰符的用法总结
https://blog.csdn.net/yudejiao/article/details/53291562

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值