我目前正在尝试学习一些C ++,并遇到了一些不直观的行为。由于t
是指向const int
的指针,只要我们不更改*t
,我希望t
保持不变。
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int a = 3;
const int* t = &a; //Why is this allowed? a is NOT const int
a = 4;
cout << *t << endl; //This does then print 4
//*t = 4; //Throws error.
return 0;
}
任何人都可以解释为什么这会编译吗?
答案 0 :(得分:4)
const int* t
只是意味着您无法更改指向t
的值t
,仅此而已。原始值可能会更改,但与t
的责任无关。
如果您想确保不会更改值,您应该让t
指向const,例如
const int a = 3;
const int* t = &a;
对于这种情况,您无法指向int*
指针。
int* t = &a; // error
答案 1 :(得分:3)
由于t是指向
const int
的指针,只要我们不更改*t
,我希望t
保持不变。
你不能一般地做出这个假设,因为t
可能指向非const对象,例如在你的例子中。
const int* t = &a; //Why is this allowed? a is NOT const int
任何人都可以解释为什么这会编译吗?
c ++规则允许将T*
隐式转换为const T*
。它是允许的,因为对非const对象有一个指向const(或引用)的指针是非常有用的。指向const的指针只是意味着无法通过指针修改对象。对象本身可以是const,也可以是非const。
作为一个有用的原因的例子,你可以将一些可修改的状态作为对象的私有成员,并返回const
视图,以便其他人可以观察,但不能修改。一个实际的例子是std::string::c_str()
。即使const char*
的内部缓冲区是非常量的,也会返回std::string
。
答案 2 :(得分:0)
由于
t
是指向const int
的指针,只要我们不更改*t
,我希望t
保持不变。
答案很简单:指针类型声明中的const
关键字并不意味着&#39;它是常数&#39;但更确切地说,你不能修改它。
这很有用,例如当你创建一个变量然后调用另一个函数来做某事时,你想要禁止修改:
extern int countZerosInArray( const int *array, int arrayLen);
int myVariableArray[ 100 ];
// ... fill the array - i.e. modify it!
int noOfZeros = countZerosInArray(myVariableArray, 100);
countZerosInArray
函数被告知它具有对数组的只读访问权限,尽管数组本身当然不是常量。
答案 3 :(得分:-4)
const int* t = &a; // int* or const int* can assgin to const int*