C++中修改const成员变量

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hanshengfei/article/details/78639067
1.c++类中定义const成员的时候必须进行初始化,而且只能通过初始化列表来进行 所以说类中存在const成员时,必须存在构造函数。当类中同时存在拷贝构造函数时也必须通过初始化列表将其初始化,否则编译器会报错
2.c++类中提供的const成员变量为只读变量,所以说我们可以通过一定的方式改变它
那么我们可以通过什么方式来改变cons成员呢?

1.C++ 中提供了const_cast强制性类型转换符,用来将const的属性去掉,使用方法:const_cast<Tppe>(expression)

#include <stdio.h>
class Test
{
private:
    int mi;
    const int mj;
public:
    const int mk;//只读变量
    Test(int i);
    Test(const Test& t);
    int getMi();
    void setmj(int p);
    int getmj(); 
};


Test::Test(int i):mj(0),mk(1)
{
    mi = i;
}


Test::Test(const Test& t):mj(0),mk(1)//拷贝构造函数存在时必须进行初始化
{
    
}
    
int Test::getMi()
{
    return mi;
}
void  Test::setmj(int p)
{	
    const_cast<int&>(mj) = p;
	
}
int Test::getmj()
{
	return mj;
}
int main()
{
    Test t(1);
    t.setmj(100);
    printf("mj = %d\n",t.getmj());//100
    printf("mk = %d",t.mk);//可以读取数据
    return 0;
}

2.我们也可以通过定义指针或者引用的方式 改变指针地址或引用变量的值来改变const成员的值

#include <stdio.h>
class Test
{
public:
	int *mp;
	int &ref;
private:
	const int mi;
	
public:
	Test():mi(0),mp(const_cast<int*>(&mi)),ref(const_cast<int&>(mi))
	{
		
		
	}
	Test(const Test&t):mi(0)//,mp(const_cast<int*>(&mi)),ref(const_cast<int&>(mi))
	{
	}
	int getmi()
	{
		return mi;	
	}

};
int main()
{	Test t;
	*t.mp = 100;
	printf("mi = %d\n",t.getmi());//100
	t.ref = 1000;
	printf("mi = %d\n",t.getmi());//1000
	return 0;
}





展开阅读全文

const 成员变量的若干问题!!

11-12

#include rn#include rn#include rn#include rn#include rn#include rn#include rn rnconst double Pi = 3.14159265;rnconst double PI = 3.14159265;rnconst int MAX = 2001;rnconst int N = 100; rnconst int M = 200; rnconst int NUM_PARA = 10; rnconst int CHILD_SIZE = 20; rnrndouble addu[MAX][7];rnint Simulate_flag = 0;rnrn//下面有函数的申明,至于函数的定义由于代码很多,没一一写出来rnvoid Load_data(double desired[][7], int num);rndouble Delay_PendL2(double u, int Delay_Order3_flag);rndouble cal_fitness_pendL2(double para1[], double desired[][6]);rndouble Order3_PendL2(double para1[NUM_PARA], double u, int Delay_Order3_flag);rnvoid Simulate(double desired[MAX][6]);rnvoid encode(double u[6], double y[6]);rnrnrn//主函数rnvoid main()rnrn double real_para[NUM_PARA] = 385, 13709, 200, 7938, 3917888, 375, 24539, 242, 6007, 4687683; rn double desired[MAX][6]; rn double new_generation[M+CHILD_SIZE][NUM_PARA+1];rn double para_min[NUM_PARA]; rn double para_max[NUM_PARA]; rn double fit_ratio[M+1]; rn double sel_chros1[NUM_PARA+1]; rn double sel_chros2[NUM_PARA+1];rn double low = 0.8; rn double upper = 1.2; rn double Mp = 0;rn double fit_pop = 0; rn int i = 0;rn if(Simulate_flag == 0)rn rn Load_data(addu, MAX);rn Simulate(desired);//这里函数输出了rn rnrnrnrn上面的是个控制台程序(运行是成功的),代码涉及到遗传算法的,这个可以撇开不谈,现在主要的工作是把这段代码写到MFC中,rn主要是写几个Edit Box控件与前面定义的几个变量MAX、M、N、NUM_PARA、CHILD_SIZE相关联,然后MessageBox输出计算结果就行了,如果这几个变量不是const类型的,代码很好整理到MFC中(这种情况很简单,整理进去不难)。现在关键的问题是这几个变量是const类型,还有double addu[MAX][7]这样的数组和void Simulate(double desired[MAX][6])这种类型的函数直接引用了const类型的变量。这种情况就很困惑了,因为const数据成员的初始化只能在类构造函数的初始化表中进行,但是这种情况很复杂了,好像也是不可行。主要是在类中的哪里可以移入这些代码。rn 望高人细心的解答一下我的困惑,本人主要是帮导师整理代码,对MFC了解不多,上面说的含糊的话,希望不要笑! 论坛

没有更多推荐了,返回首页