我想保护类的成员变量,故而声明为const对象,现见:
class A
{
public:
A(const double * const p1, const double * const p2)
: a{ p1, p2 } // 此处编译异常C2536
{
}
private:
const double * const a[2];
};
对上述A类有疑问:
1、在“const double * const a[2];”中,第二个const能否保证a[0]和a[1]为常量?
2、在“: a{ p1, p2 } // 此处编译异常C2536”中,不能编译通过,为什么?改为a({p1, p2})或a[0](p1),a[1](p2)等,均不可。
3、而" const double * p[2] = {p1, p2}; "能通过的。
现今代码中,仅保留第一个const,而去除第二个const,不过不大保险。
MSDN:
A nonstatic array declared with the const specifier. This kind of array cannot be explicitly initialized.
MSDN:
不支持常非静态数组显示初始化。
上述中,“const double * const a[2];”等于
"const double * const * const a;"且"a(new const double * const *[2])//在初始化时"。
如果为
class B
{
public:
B(const double * const p) : b(p) {}
private:
const double * const b;//非指针数组
};
是可以的。
若用vs2013编程,则class A和class B都不显示错误,但class A有编译异常C2536。
在C++中,如何初始化类的常指针数组成员变量?
答案:2 悬赏:40 手机版
解决时间 2021-02-04 00:50
- 提问者网友:浪荡绅士
- 2021-02-03 07:58
最佳答案
- 五星知识达人网友:洒脱疯子
- 2021-02-03 08:36
第一 你的第二个const可以保证他俩都是常量
第二 你的这一句 const double * const a[2]; 应该有一个错 叫做 未初始化的常量
常量就是 声明的时候初始化 然后以后不允许改 你反过头来看你的程序
你把他俩声明为了常量 但是没有初始化 第一个错误 你给两个常量赋值 第二个错误
第三 你的const是代表p这根指针不能改了 但是他指向的值可以改 这是符合逻辑的
不然你怎么赋值
如果你想保护这个值 已经保险了 因为你这个类里 private的数据其他东西无法访问
第二 只有在构造的时候可以给a[0] a[1]赋值 其他时候都不行 所以已经保护好了
第二 你的这一句 const double * const a[2]; 应该有一个错 叫做 未初始化的常量
常量就是 声明的时候初始化 然后以后不允许改 你反过头来看你的程序
你把他俩声明为了常量 但是没有初始化 第一个错误 你给两个常量赋值 第二个错误
第三 你的const是代表p这根指针不能改了 但是他指向的值可以改 这是符合逻辑的
不然你怎么赋值
如果你想保护这个值 已经保险了 因为你这个类里 private的数据其他东西无法访问
第二 只有在构造的时候可以给a[0] a[1]赋值 其他时候都不行 所以已经保护好了
全部回答
- 1楼网友:duile
- 2021-02-03 09:08
main.cpp#include "1.h"int main(){ tarray a(10); // a是一个double 类型的长度为10动态数组 tarray b; // b是一个double 类型的尚未确定其长度的动态数组 b.setlen(7); // 使b成为一个长度为7的动态数组 double d[10] = { 1,2,3,4,5,6,7,8,9,10 }; a.input(d,10); // 把c中的10个元素复制到a中 a.print(); // 打印a中的元素 tarray c(a); // 创建了一个与a一样的c数组 b = a; // 把a的内容复制给b a.setelem(0,6); // 把第0个元素的值重新赋值为6 b.exchange(4,2); // 交换b中第4个和第2个元素的内容 b.print(); // 打印b中的元素 a.print(); // 打印a中的元素 c.print(); // 打印c中的元素 return 0;}1.h#includeusing namespace std;class tarray{private: double *a; int n;public: tarray(); tarray(int number); tarray(tarray &p); void setlen(int m); void input(double *b,int m); void print(); void setelem(int m,double r); void exchange(int m,int r); tarray operator=(tarray); ~tarray();}; tarray::tarray(){ a=null; //默认构造a=null,n=0;你的那个n没初始化,a申请内存肯定出错 n=0;} tarray::tarray(tarray &p){ n=p.n; a=new double[n]; for(int i=0;i
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯