浅谈const变量赋值报错分析

 更新时间:2015年07月01日 10:26:35   投稿:hebedich  
在类中 只有静态变量能赋值 如果你不赋值 编译器会认为你这个变量根本没用 不能被修改 又没有初始值 两个办法 在构造函数的初始化列表赋值 或者在const前面加一个static

从变量到常量的赋值是合法C++的语法约定的,

如从char 到const char顺畅;
但从char **到 const char **编译器就会报错:

复制代码 代码如下:

error: invalid conversion from `char**' to `const char**'

示例:

int main(int argc, char *argv[])
{
  char a = '1';
  const char b = a;

  char * a2 = "12345";
  const char * b2 = a2;

  char** a3 = NULL;

  //const char** b3 = a3; //error
   char** const c3 = a3; //ok
   char* const * d3 = a3; //ok
}

原因:

const char** b3 说明 b3的指针可以变更,可以再指向另外一个地址;
b3和a3都是unqualified的,但b3指向的对象类型为pointer to const char,
a3指向的对象类型为 pointer to char,两者是不相容类型,
不符合两操作数必须指向相容类型的规定,因此赋值非法。
更详细的解释详见参考资料1;

而char** const c3 = a3;正确,则是因为const限制了c3指针的地址变更,即它指向了a3,就不再能变更指向其它指针了;这就限制了指针地址变更可能发生的潜在问题;

当然这时候,使用一个强制类型转换,可以解决这个编译错误:

复制代码 代码如下:

    const char** b3 = const_cast<const char**>(a3); // ok

但转换后的代码再出现问题就很难排查了;

强制类型转换的潜在问题

看以下示例:

class Foo {
public:
 Foo(){
   i = 1;
 }
 void modify(){// make some modification to the this object
   i = 2;
 } 
 void print() const {
   cout << "Foo_i:" << i << endl;
 }
private:
 int i;
};

//演示潜在的危险  
//error: invalid conversion from `Foo**' to `const Foo**'
/////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
  const Foo x;
  Foo* p;

  //const Foo ** q = &p; //q now points to p; this is (fortunately!) an error
  const Foo ** q = const_cast<const Foo **>(&p); 
  *q = &x; // p now points to x
  p->modify(); // Ouch: modifies a const Foo!! 
  x.print(); // print: Foo_i:2
  return 0;
}

我们定义了一个常量的Foo,常量Foo方法打印出来的永远为1;

Foo**到const Foo **的转换报错,

通过一个强转符让编译通过,

最后的x.print()的结果是2;这样的潜在危险在正式的项目代码中就很难发现;

很难会想到一个const对象还能够变更;

以上所述就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • 使用MySQL编程实现C语言功能强大化步骤示例

    使用MySQL编程实现C语言功能强大化步骤示例

    这篇文章主要为大家介绍了使用MySQL编程实现C语言功能强大化步骤示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Qt图形图像开发之曲线图表库QChart编译安装详细方法与使用实例

    Qt图形图像开发之曲线图表库QChart编译安装详细方法与使用实例

    这篇文章主要介绍了Qt图形图像开发之曲线图表库QChart编译安装详细方法与使用实例,需要的朋友可以参考下
    2020-03-03
  • 详解C语言初阶基础

    详解C语言初阶基础

    这篇文章主要介绍了C语言中的初阶基础,介绍了其相关概念,具有一定参考价值。需要的朋友可以了解下,希望能够给你带来帮助
    2021-11-11
  • VS2022 Git提交代码的实现

    VS2022 Git提交代码的实现

    本文主要介绍了VS2022 Git提交代码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C语言数据类型和格式说明符基础教程示例

    C语言数据类型和格式说明符基础教程示例

    这篇文章主要为大家介绍了C语言数据类型和格式说明符基础教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • C++高级程序员成长之路

    C++高级程序员成长之路

    本文主要是结合自身的经验,给大家罗列了一些如何成为C++高级程序员的方法和注意事项,分享给大家,希望对新手能够有所帮助。
    2015-12-12
  • C++中关于this指针的入门介绍

    C++中关于this指针的入门介绍

    this 指针在C++类和对象中是个很方便实用的关键字,可以简化对象成员属性的调用,使代码表达的含义更加准确;在之前的学习中我们都可以判断变量所占内存空间大小,那么我们创建的类对象所占的内存空间怎么计算呢?想知道this的妙用和类对象占用的内存空间就来跟我学习吧
    2022-07-07
  • C语言中const和define的区别你了解嘛

    C语言中const和define的区别你了解嘛

    这篇文章主要为大家详细介绍了C语言中const和define的区别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 基于C++实现简单日期计算器

    基于C++实现简单日期计算器

    这篇文章主要介绍了基于C++实现简单日期计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 用C语言实现简单扫雷游戏

    用C语言实现简单扫雷游戏

    这篇文章主要为大家详细介绍了用C语言实现简单扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论