代码先锋网 代码片段及技术文章聚合

c++常对象和常成员函数详解

常对象

常对象是指该对象在其生命周期内,其所有的数据成员的值都不能被改变;定义对象时加上关键字const,该对象就是常对象,其一般形式如下:

类名 const 对象名[(实参类别)];
或者
const 类名 对象名[(实参类别)];

形如:const CComplex num;

需要特别说明的是:

1. 常对象只能调用常成员函数,不能调用普通成员函数
(除了隐式调用析构函数和构造函数),常成员函数是常对象的唯一对外接口;
2. 现在编译系统只检查函数的声明,只要发现调用了常对象的成员函数,而且该函数未被声明为const,编译阶段就报错
3. 常对象在被定义时需要被初始化;

类设计源码:

class CComplex
{
public:
    //普通构造函数
    CComplex(int nReal, int nImag):m_nReal(nReal),m_nImag(nImag)
    {
        cout << "common constructor function" << endl;
    }
    int GetRealNum()
    {
        return m_nReal;
    }
private:
    int m_nReal;
    int m_nImag;
};
//常对象
const CComplex num1(1,1);
//error:不能将“this”指针从“const CComplex”转换为“CComplex &”
int nReal = num1.GetRealNum();

编译错误的原因是,目前该函数还是普通函数,它可能会修改成员变量;为了常对象能调用GetRealNum函数,应该将该函数设计成常成员函数;

形如int GetRealNum() const;

常数据成员

如果我们希望在创建对象后,该对象的某个数据成员就保持不变,我们可以将这个数据成员设置为常数据成员;常数据成员只能通过构造函数初始化列表进行初始化,其他形式的函数均不能进行数据的赋值;

常成员函数

若将成员函数设置为常成员函数,则只能引用本类中的数据成员,而不能修改它;常成员函数可以引用const数据成员,也可以引用非const的数据成员;常成员函数的一般形式为:

类型名 函数名(形参列表) const

这里的const关键字是函数类型的一部分,在函数声明和函数定义时都要带const关键字,否则被编译器认为是不同的两个函数,但是在函数调用的时候不必带const;

形如:

//声明和定义一起实现
int GetRealNum() const
{
   return m_nReal;
}

函数API设计总结

(1) 若我们定义了一个常对象,则指向这个常对象的指针变量或者对象引用也需要是const类型的;一般形式如下:

const 类型名* 指针变量名;
const 类型名& 引用名;

(2)常对象的唯一对外接口是常成员函数;
(3)为了节约时间开销和时间开销,一般将函数形参定义为指针或者引用类型;
(4)若不希望传入的实参对象被修改,应该将形参定义指向常对象的指针变量或者引用;

根据以上几点知识,我们进行类设计时,最好遵循以下两点结论:

1.将不涉及数据成员修改的函数定义为常成员函数

形如: int GetRealNum() const

2.当发生函数调用时,希望传入的实参对象不被修改,应当将形参定义为const类型的指针或者引用;这个实参可以是const类型的,也可以是非const类型的,函数接口兼容性更加,形如:

static void TransByPointer(const CComplex* obj)
{
    cout << "TransByPointer \n" << endl;
}

static void TransByRefence(const CComplex& obj)
{
    cout << "TransByRefence \n" << endl;
}

下面给出const相关知识的具体调用说明:

数据成员 非const的普通成员函数 const成员函数
非const的普通数据成员 可以引用,也可以改变值 可以引用,但不可以改变值
const数据成员 可以引用,但不可以改变值 可以引用,但不可以改变值
const对象 不允许 可以引用,但不可以改变值

版权声明:本文为weixin_30540691原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30540691/article/details/98468555

智能推荐

C++ 常函数和常对象

目录 常函数和常对象 常函数 常对象(包括常指针和常引用) 使用关键字mutable 总结 常函数不能对普通成员变量(除mutable修饰外)进行写操作  常函数可以被普通对象或者常对象调用   常对象不能调用所有普通函数 常对象只能调用常函数   常函数和常对象 常函数 常函数声明方式 返回值  函数名称 (参数) const; 上述 为常函数的声明 具体...

C++:常函数和常对象

 常函数:在成员函数后加const 常对象:在类型前面加const mutable关键字:可以使成员变量被成员函数改变  ...

C++ 常对象和常函数

常对象和常函数 常对象和常函数 常函数 常对象 不能同时用static和const修饰类的成员函数 常对象和常函数 常函数 成员函数 声明后面加const ,如:void showPerson() const const目的是为了修饰成员函数中的this指针,让指针指向的值不可以修改 有些属性比较特殊,依然在常函数或者常对象中可以修改,需要加入关键字 mutable进行修饰 常对象 使用const...

猜你喜欢

[C++之旅] 17 常对象成员和常成员函数

[C++之旅] 17 常对象成员和常成员函数 一、常对象成员和常成员函数 常对象成员 常对象成员:对象成员采用const修饰 例如线段Line这个类中包含Coordinate点这个类,想要实例化一个固定的线段就可以使用const修饰Coordinate这个类。实例如下 Coordinate表示点的类,其中包含点的xy坐标 Line表示线的类,包含两个点的类,即包含AB两个坐标点 注意:const修...

C++关于const的常对象成员和常成员函数

首先const修饰变量时初始化不能用我们平常的方式初始化 也就是下面这种方式是不正确的 我们初始化一个const修饰的变量只能用初始化列表的方式进行 我们不仅可以用const来修饰一个简单的变量,还可以用来修饰一个对象,用const来修饰的对象就叫做常对象成员,写成const Coordinate  m_coorA,或者是Coordinate const m_coorA 也可以用来修饰一...

C++——常对象成员和常对象

前言 静态成员的使用让类的对象之间能够共享数据,友元的使用破坏了类的封装性,却给了类的“朋友”对本类成员访问的特权。但是,有时候要求数据在能共享的前提下还不能被修改,也就是要实现数据的保护。常变量就是使程序运行过程中值不能被改变,同样也可以让对象具有这样的特性。 常成员变量 在类的成员定义中,使用修饰符const说明的成员变量称为常成员变量。常成员变量必须初始化,并且不能被...

C++基础(9)常成员函数与常对象

       使用const说明的成员函数称为常成员函数。常成员函数不能修改对象数据成员的值,它通常用于获取对象的状态。        常对象在定义时就必须进行初始化。常对象的数据成员值在对象的整个生存周期内不能被改变。而且,为了对常对象进行保护,不允许常对象调用普通的成员函数,只能调用常成员函数。 常成员函数的声明形...

c++常量_常对象_常成员函数

常量 c++中定义常量的方法相对c有些不一样。 常对象 常对象就是定义为常量的对象,如下: 常对象由于不能改变成员变量,因此只能调用 常成员函数,否则报错。 但常对象仍然可以访问公有成员变量,可以读取而不能修改。 常成员函数 常成员函数就是类定义中被定义为const 的函数,其特点是:只可读取类的常量、变量而不能改变。 其它 基本就这么多。 需要注意的是:临时变量、局部变量的传送可以通过以下方式:...