浅谈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对象还能够变更;

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

相关文章

  • C++利用libcurl库实现多线程文件下载

    C++利用libcurl库实现多线程文件下载

    这篇文章主要为大家详细介绍了C++如何利用libcurl库实现多线程文件下载,文章的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-01-01
  • C++中赋值运算符与逗号运算符的用法详解

    C++中赋值运算符与逗号运算符的用法详解

    这篇文章主要介绍了C++中赋值运算符与逗号运算符的用法详解,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言实现Floyd算法

    C语言实现Floyd算法

    这篇文章主要为大家详细介绍了C语言实现Floyd算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言动态内存管理malloc柔性数组示例详解

    C语言动态内存管理malloc柔性数组示例详解

    这篇文章主要为大家介绍了C语言动态内存管理malloc柔性数组示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 详解C++中vector的理解以及模拟实现

    详解C++中vector的理解以及模拟实现

    vector是表示可变大小数组的序列容器。这篇文章主要为大家详细介绍了vector的理解以及模拟实现,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-03-03
  • C++内存管理之简易内存池的实现

    C++内存管理之简易内存池的实现

    大家好,本篇文章主要讲的是C++内存管理之简易内存池的实现,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2021-12-12
  • 有关C++继承与友元、继承与类型转换详解

    有关C++继承与友元、继承与类型转换详解

    下面小编就为大家带来一篇有关C++继承与友元、继承与类型转换详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C++无法重载点符号、::、sizeof等的原因

    C++无法重载点符号、::、sizeof等的原因

    这篇文章主要介绍了C++无法重载点符号、::、sizeof等的原因的相关资料,需要的朋友可以参考下
    2016-05-05
  • C++实现折半插入排序(BinaryInsertSort)

    C++实现折半插入排序(BinaryInsertSort)

    这篇文章主要为大家详细介绍了C++实现折半插入排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C语言强制类型转换规则实例详解

    C语言强制类型转换规则实例详解

    强制类型转换是把变量从一种类型转换为另一种数据类型,下面这篇文章主要给大家介绍了关于C语言强制类型转换的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06

最新评论