常量对象与常量成员函数

常量对象与常量成员函数来防止修改对象,实现最低权限原则。

可以用关键字const来指定对象是不可修改的,任何修改该对象的企图,都会导致编译错误。

例如:const Time noon(12,0,0);    声明一个Time 类的常量对象noon,并将它初始化为中午12点。

C++不允许在常量对象上调用成员函数,除非成员函数本身也被声明为常量。甚至对不会修改对象的成员函数,也是如此,此外,编译器不允许声明常量的成员函数修改对象。

对一般情况下,通常修改对象的构造函数和析构函数而言,它们不允许被声明成const。

关于常量对象和常量成员函数的使用方法如下:

(1)非常量对象调用非常量成员函数         (正确)

(2)非常量对象调用常量成员函数           (正确)

(3)常量对象调用常量成员函数             (正确)

(4)常量对象调用非常量成员函数           (错误)

尽管构造函数必须是非常量成员函数,但它仍然可用于初始化常量对象。

常量对象的“常量性”是在构造函数完成了对象的初始化之后生效的,持续到调用了对象的析构函数。

成员函数没有修改对象的事实,并不足以表明它就是常量函数,常量函数必须显式地用const声明。

常量成员函数的初始化必须用初始化列表。

例如:Increment::Increment(int c,int i) : count(c),increment(i);{}

初始化列表出现在构造函数的参数表 和 表示构造函数函数体开始的左大括号之间。成员初始化列表用冒号和参数表隔开。

量数据成员(常量对象和常量变量)以及被声明为引用的数据成员,都必须用成员初始化列表初始化,在构造函数中对这些类型的数据赋值是不允许的。

参考资料:《c++程序员教程》 电子工业出版社 张良华等译   P273-P280

时间: 2024-10-01 00:22:57

常量对象与常量成员函数的相关文章

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

常对象: 定义常对象的一般形式为: 类名 const 对象名[(实参表列)]; 也可以把const写在最左面: const 类名 对象名[(实参表列)]; 二者等价. 常对象的所有成员值都不能变,必须先初始化,不能调用非const成员函数 const成员函数: void get_time( ) const ; //将函数声明为const 不能改变类中的成员值们可以访问,若非要改变,可以把成员变量设置为mutable. const是函数类型的一部分,在声明函数和定义函数时都要有const关键字 不

C++中const对象和const成员函数

1?  成员函数可以声明成const函数(声明后加const) 2?  对于const对象,只能调用const成员函数 3?  Const函数和非const函数可以形成重载 4?  对于非const对象的函数调用优先选择非const成员函数 5?  对于类中的mutable数据成员,可以被const成员函数修改 // // main.cpp // Const // // Created by 06 on 15/1/24. // Copyright (c) 2015年 黄永锐. All right

使用指向对象的空指针访问对象中的成员函数

class AES  {      public:          AES(){m_data=2;}          virtual void fun1(){cout<<"fun1"<<endl;}          void fun2(){cout<<"fun2"<<endl;}          void fun3(){cout<<m_data<<endl;}      private:

&lt;C++&gt; 类(3):初始化列表 常函数和常量对象 虚函数与多态(包括纯虚函数)

一.初始化列表(初始化列表中必须有的两个内容) 1.类中const的成员变量: ①特点:不能修改 必须初始化 在构造函数后面加冒号 格式为:":变量名(值)" 也就是说 常量必须在初始化列表中初始化 ②执行顺序:构造函数先执行初始化列表 然后执行函数中的内容 1 #include<iostream> 2 using namespace std; 3 4 class CPerson 5 { 6 public: 7 const int a; 8 public: 9 CPerso

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

先明确几个概念: 1. 常对象只能调用常成员函数. 2. 普通对象可以调用全部成员函数. 3. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针.4. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针. 5. 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值:   在X类的const成员函数中,this指针的

C++ 常成员函数、常数据成员、常对象

常成员函数在声明和实现时都要带 const 关键字 常成员函数不能修改对象的数据成员,也不能访问类中没有用 const 声明的非常成员函数. 在任何函数中都不能对常数据成员赋值.对常数据成员初始化,只能通过构造函数的初始化列表. 常对象的数据成员在它的生存期内不会被改变,因此定义常对象时必须对其进行初始化.这里的初始化可以通过初始化列表完成,也可以通过构造函数函数体来完成. class Person { public: string name; Person() { name = "mollnn

C++类的成员函数存储方式(是否属于类的对象)

今天在看TAF源码的时候,发现下面一段有趣的代码: getSmallerProxyPrx = Application::getCommunicator()->stringToProxy<GetSmallerPrx>(MobileAssist.JiangeSmallerServer.GetSmaller); //此处T为GetSmallerPrx template<class T> T stringToProxy(const string& objectName,con

非const对象也可以调用const成员函数

当一个类只有const成员函数的时候,非const对象也可以调用const成员函数: // ConstTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class A { public: A( void ) { } void func( void ) const { cout << "const version"

C++类的默认成员函数

成员函数隐含this指针参数: 每成员函数一个隐式的指针形参(构造函数除外): 对象在调用成员函数时,编译器会将对象的地址传递给this指针: 1.构造函数(需用一个公有成员函数对私有的成员变量进行初始化,在对象构造时执行一次,无参的构造函数和带缺省值的构造函数都是缺省构造函数 ,缺省的构造函数只能有一个) Mystring(const char *str="")//带缺省值的构造函数 { _str = new char[strlen(str) + 1]; strcpy(_str, s