C++ 常量对象存储在哪里
我理解函数不应该返回对自动变量的引用。 然而,我只是想了解常量对象存储在哪里,即它是否与静态全局变量一起存储在内存部分 下面是VisualStudio8上的代码。看起来常量对象是作为自动变量存储的。我是否假设事情是正确的,或者它是特定于实现的,还是取决于构造函数是否微不足道 如果有人能解释为什么这些案例都是这样的话,那就太好了C++ 常量对象存储在哪里,c++,reference,constants,C++,Reference,Constants,我理解函数不应该返回对自动变量的引用。 然而,我只是想了解常量对象存储在哪里,即它是否与静态全局变量一起存储在内存部分 下面是VisualStudio8上的代码。看起来常量对象是作为自动变量存储的。我是否假设事情是正确的,或者它是特定于实现的,还是取决于构造函数是否微不足道 如果有人能解释为什么这些案例都是这样的话,那就太好了 //here i'm intentionally returning a ptr to local const ptr hope the syntax is right
//here i'm intentionally returning a ptr to local const ptr hope the syntax is right
const char* const* get_const_char_ptr() {
const char * const ptr = "downontheupside";
return &ptr;
}
const int& get_const_int() {
const int magic_number = 20;
return magic_number;
}
const string& get_const_string() {
const string str("superunknown");
return str;
}
const string* get_const_string_ptr() {
const string str("louderthanlove");
return &str;
}
int main() {
//case1
const int &i = get_const_int();
cout<<"case1:"<<i<<endl;
//case 2
const char * const* c =get_const_char_ptr();
cout<<"case2:"<<*c<<endl;
//case3
const string &str = get_const_string();
//this crashes
//cout<<"case3:"<<str<<endl;
return 1;
}
函数中分配的常量对象与任何其他自动变量一样;它们只有常量类型。全局变量和类静态变量略有不同:一些常量可以放在可执行文件的只读部分,然后复制到内存中。用于字符串和整数常量之类的内容;我不相信它用于任何具有非平凡构造函数的东西。const不会更改存储内容的位置。它是一个关键字,用于告诉编译器防止变量或函数修改内容。例如:
std::string myNormalStr("Hello");
const std::string myConstStr("Don't Change Me");
myNormalStr = myConstStr; // this is ok
myConstStr = myNormalStr; // this will give you a compile error
这是一个超级简单的例子,但同样的事情也适用于传递到函数中、从函数返回或函数本身是const的const对象
下面是使用const关键字的所有正确方法
编辑:
目前几乎没有理由使用auto关键字,因为在它的范围内,所有内容都是隐式自动的。此关键字是自动变量的存储类说明符
然而,AutoTwitter正在作为新C++标准的一部分进行更改,但已经由VisualStudio 2010和其他新的Grand格式的编译器支持。在C++0x中也可以这样使用:
std::vector<int> numbers;
for (std::vector<int>::const_iterator itr(numbers.begin());
itr != numbers.end(); ++itr)
{
// do something with each iterated element
}
// compiler auto deduces from rvalue
// and determines that you want a
// std::vector<int>::const_iterator type
for (auto itr = numbers.cbegin();
itr != numbers.cend(); ++itr)
{
// do something with each iterated element
}
关于存储位置的所有信息都是特定于实现的。永远不要忘记这一点。有了这个警告,这里有一些典型的规则 自动变量存储在堆栈或寄存器中。不管它们是不是常数 静态变量存储在程序内存中。程序内存可能有多个块,有些是只读的,有些不是。声明变量const可能会影响存储内容的块
用new分配的变量将在堆上。不管它是否为常量。我不确定我是如何忽略了这一点的:这是大多数系统在实践中发生的情况,但这不是标准所要求的。