C/C++中const关键字

C语言中const关键字

lee-Macbook-Air:cplusplus lee$ cat tmp.c
#include <stdio.h>

int main()
{
	const int var = 100;
	int* p = &var;
	*p = 200;
	printf("p = %p, &var = %p\n", p, &var);
	// printf("%d\n", var);
	return 0;
}
lee-Macbook-Air:cplusplus lee$ gcc tmp.c
tmp.c:6:7: warning: initializing 'int *' with an expression of type
      'const int *' discards qualifiers
      [-Wincompatible-pointer-types-discards-qualifiers]
        int* p = &var;
             ^   ~~~~
1 warning generated.

在C语言中,非const指针可以指向一个const变量

在编译过程中,会有警告

但是仍然不能修改const的值,仍然var = 100;

p中存放的地址和var的地址也是相同的

C++中const关键字

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

void fun(int& tmp_var)
{
    cout << tmp_var << endl;
}

int main()
{
    const int var1 = 100;
    int* p = const_cast<int*>(&var1);
    *p = 200;

    assert(p == &var1); // p 存放的地址和var1的地址是相同的
    cout << "*p = " << *p << endl;
    cout << "var1 = " << var1 << endl;
    // 相同的地址中却存放着不同的内存,这样是不符合规则的
    // 所以*p 取出的内容到底是什么呢?为什么不是p指向的地址呢.

    fun(const_cast<int&>(var1)); // 一个临时值是200
    return 0;
}

/*
output:

*p = 200
var1 = 100
200
*/

为什么会出现这样诡异的事情呢?

因为const_cast并非用于将const限定的对象用于赋值,所以出现了这样的“不确定性”

IBM的C++指南称呼“*modifier = 7;”为“未定义行为(Undefined Behavior)”。所谓未定义,是说这个语句在标准C++中没有明确的规定,由编译器来决定如何处理。参考:地址:http://www.cnblogs.com/ider/archive/2011/07/22/cpp_cast_operator_part2.html

具有歧义Code

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

void func1(const int& tmp)
{
    cout << "func1 " << tmp << endl;
}

void func2(int tmp)
{
    cout << "func2 " << tmp << endl;
}

void func3(const int* tmp)
{
    cout << "func3 " << *tmp << endl;
}

int main()
{
    const int a = 10;
    int& b = const_cast<int&>(a);
    b = 20;
    cout << a << endl;
    cout << b << endl;

    assert(&a == &b); // 断言 a b地址是否相等

    func1(a);
    func2(a);
    func3(&a);

    return 0;
}

/*
output:

10
20
func1 20
func2 10
func3 20
*/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部