保持const和non-const函数代码的一致

在用C++进行面向对象编程的时候,有时需要在一个类里包含两个代码相似的函数,而它们之间的唯一区别是,一个为const类型,一个是non-const类型。

此时如果将相同的代码写在两个函数中,则严重违反了DRT(Don‘t repeat yourself)原则。正确的做法是:让non-const函数引用const函数,如下所示:

class Sample
{
public:
	const char& doSomething()const
	{
		//there is some code to do
	}

	char& doSomething()
	{
		return const_cast<char&>
		(static_cast<const Sample&>(*this).doSomething());
	}
};

  在non-const的doSomething函数中,如果我们直接在里面调用doSomething函数,则编译器会默认你调用的是non-const版本的,那么程序就会陷入永无终止的递归中。为了防止这一点,应当首先利用static_cast操作符将该类的实例转化为const类型,此时再调用doSomething就是const的版本了。然后因为最终要返回non-const的char的引用类型,因此还需要用const_cast消除掉变量的const特性。这样一来,虽然代码的形式会比较丑陋,但实现了对代码重复利用的目标。

时间: 2024-10-16 12:34:38

保持const和non-const函数代码的一致的相关文章

const 小结: 做函数参数,做函数返回值,以及const函数

做函数参数 : 例如 fun(const int * i)参数i的值不能在fun()函数执行的过程中被修改,它将一直保持调用此函数时传入的值.如果试图修改i值的语句在fun()函数中出现,将导致程序无法编译,这样对参数i起到保护作用. 注:const 通常用来限制函数的指针参数,引用和数组参数,而一般形式的参数因为形参和实参本不是同一内存单元的变量,所以对形参的修改不会影响实参,因此也没有必要限制函数体不能对参数进行修改.  做函数返回值 : 函数返回值为 const 只有用在函数返回为引用的情

【ThinkingInC++】45、比较const和非const成员函数的例子

/** * 书本:[ThinkingInC++] * 功能:旧代码中的enum hack * 时间:2014年9月10日08:35:13 * 作者:cutter_point */ #include<iostream> #include<ctime> #include<cstdlib> using namespace std; class Bunch { enum {size=1000}; int i[size]; }; int main() { cout<<

const参数,const返回值与const函数

在C++程序中,经常用const 来限制对一个对象的操作,例如,将一个变量定义为const 的: const  int  n=3; 则这个变量的值不能被修改,即不能对变量赋值. const 这个关键字经常出现在函数的定义中,而且会出现在不同的位置,比如: int  strcmp (const   char  *str1,const    char  *str2); const    int  & min (int  &, int  &); void  printMessage (c

c++中的const参数,const变量,const指针,const对象,以及const成员函数

const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whenever you need”. 1.用const 修饰函数的参数 如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能.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

c++ const: const 变量, const 输入参数, const 返回值, const 成员函数

看到const 关键字,C++程序员首先想到的可能是const 常量.这可不是良好的条件反射.如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮.const 更大的魅力是它可以修饰函数的参数.返回值,甚至函数的定义体. const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whenever you need”. 1.用const 修饰函数的参数

VS2017中遇到不存在从string到const char*的转换函数的解决方法

使用c_str()函数 c_str函数的返回值是const char*. c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式. 举个栗子: String st = "insert into chuang values ('" + vos[0] + "', '" + vos[1] + &qu

函数被const修饰,const修饰的究竟是谁?

const修饰,意味着不可更改,即只读.那么const修饰函数时,是谁不可更改?是形参吗? 其实本质上,const修饰的是函数隐含的this指针,this所指向的内存空间不可更改.如下案例中属性x,y不可更改,形参a,b可更改.因为形参在函数被调用时才分配内存. class Test { void Func(int a,int b) const { ... } //void Func(const Test* this,int a,int b) const { ... } private: int

[C++]const Box * p || Box const * p || Box * const p的区别

const与指针结合使用时,容易让人迷惑的是: 1. const到底是限定该指针不可再指向其它内存呢? 2. 还是禁止通过该指针修改其指向的内存块的内容?(PS:这里说的是禁止通过该指针修改内存块,所以不是不能修改,而是要通过其它方式去修改.) 下面来探究一下,先上基础代码. // Box.h author:[email protected] #ifndef _BOX_H #define _BOX_H class Box { public : Box(); int volume(); void