关于类中const 数组成员初始化的问题

xxj2012xxj 2012-05-28 06:12:06
在一个类中定义了一个私有的常数组 也就是说这个数组里面的东西 不能被改变
而且 要在构造这个类的时候就把这个数组给赋值了 怎么处理
我试了几种方法 都失败了 求教各位大牛。
程序代码:
const int b[3] = {1, 2, 3};
class A
{
public:
A();
private:
const int a[3];
};

A::A(int b[3])
{
for (int i = 0; i < 3; i++)
a[i] = b[i];
}

---这样不行
程序代码:

class A
{
public:
A();
private:
const int a[3] = {1, 2, 3};
};

直接赋值也不行
...全文
847 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

试了下 7 楼给的几种方法
我的编译器 对第一种方法是报错的。
其他的都很好。 谢谢。
[/Quote]

目前大多数编译器对C++11的标准支持还非常有限。
xxj2012xxj 2012-05-28
  • 打赏
  • 举报
回复
试了下 7 楼给的几种方法
我的编译器 对第一种方法是报错的。
其他的都很好。 谢谢。
FrankHB1989 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

C++ 11好像支持类似下面这样的写法:
C/C++ code

{
private:
const int ci[3];
public:
BClass():ci({1, 2, 3})
{
}
};



以前的标准都是不可以的。可能的makeshift方法:
1.
C/C++ code

#include <iostream>
using names……
[/Quote]
BClass():ci({1, 2, 3}){}这样g++4.7会有警告:warning: list-initializer for non-class type must not be parenthesized。
应该更简单点:BClass:ci{1,2,3}{}。
就算是类类型,聚集初始化的{}写成={}倒可以多点兼容性,不过这里的情况就没必要了。
pathuang68 2012-05-28
  • 打赏
  • 举报
回复
C++ 11好像支持类似下面这样的写法:

{
private:
const int ci[3];
public:
BClass():ci({1, 2, 3})
{
}
};


以前的标准都是不可以的。可能的makeshift方法:
1.

#include <iostream>
using namespace std;

class BClass
{
private:
static const int ci[3]; // 在前面加上static
public:
void print_info()
{
for(int i = 0; i < 3; ++i)
{
cout << ci[i] << endl;
}
}
};

const int BClass::ci[3] = {1, 2, 3}; // 在这里初始化

int main(void)
{
BClass b;
b.print_info();

return 0;
}


2.

#include <iostream>
#include <vector>
using namespace std;


int a[3] = {1, 2, 3};

class BClass
{
private:
const vector<int> v; // 用vector来代替数组
public:
BClass():v(a, a + 3) // 初始化列表初始化
{
}

void print_info()
{
for(int i = 0; i < 3; ++i)
{
cout << v[i] << endl;
}
}
};

int main(void)
{
BClass b;
b.print_info();

return 0;
}
FrankHB1989 2012-05-28
  • 打赏
  • 举报
回复
C++98/03的缺陷。
用C++11的brace-or-equal-initializer
pathuang68 2012-05-28
  • 打赏
  • 举报
回复
Hammer42 2012-05-28
  • 打赏
  • 举报
回复
常量 再类定义的时候,在自定义构造函数里进行初始化啊,系统不再提供构造函数了
xxj2012xxj 2012-05-28
  • 打赏
  • 举报
回复
这也是种方法 有没有在保持const的情形下 对数组的赋值方式?
Saleayas 2012-05-28
  • 打赏
  • 举报
回复
static const int a[] = { 1, 2, 3 };
W170532934 2012-05-28
  • 打赏
  • 举报
回复
使用cpp中的mutable.


突破const:

const固然是个好东东,但是有的时候可能不爽const的限制,比如某些时候我要修改const的值怎么办呢?此时可以使用const_cast来帮忙了。请注意,const_cast是运算符(关键字)而不是函数,比如要去掉const属性,可以:

const int a=3;
int b=(const_cast)<int>(a);
如果要去掉函数的const属性 可以声明关键字mutable,它允许const函数体内修改被mutable声明的变量的值,下面是一个MSDN里面的例子:

// mutable.cpp
class X
{
public:
bool GetFlag() const
{
m_accessCount++;
return m_flag;
}
private:
bool m_flag;
mutable int m_accessCount;
};

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧