我已经初始化了常量引用z,并尝试使用初始化列表重新初始化它,而我得到的输出是更改后的值。没有错误,没有警告。
#include <iostream>
using namespace std;
class Point {
private:
const int &z=9;
public:
Point (int &c):z(c){}
int get_setz(){
return z;
}
};
int main()
{
int m=3;
Point p(m);
cout << p.get_setz();
return 0;
}
Output :
3
Run Code Online (Sandbox Code Playgroud) 为什么以下代码不发出警告?
与-Wall,-Wpedantic,-Wextra一起编译,并且没有一个发出警告。
int main()
{
const char *p;
char a[] = "hey";
p = a;
(void) p;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望收到某种警告,例如分配-Wdiscarded-qualifiers
通常在C中,如果我想声明一个常量字符串,我可以这样做:
const char *p = "Friend";
Run Code Online (Sandbox Code Playgroud)
但是,如果我真的想弄清楚要点,可以这样做:
const const const const const const const const const const const const const
const const const const const const const const const const const const const
const const const const const const const const const const const const const
const const const const const const const const const const const const const
const const const const const const const const const const const const const
const const const const const const const const …Run Code Online (Sandbox Code Playgroud) 当指针的数据为const时,更改指针指向的位置是否为未定义行为?例:
const char* p = "foo";
p = "boo";
Run Code Online (Sandbox Code Playgroud)
我相信这不是UB,因为指针本身不是const,并且我没有修改该"foo"对象。
额外的问题:并更改不是const指针的const数据?会UB吗?例:
char* const p = "foo";
(*(char**)&p) = (char*)malloc(strlen(p));
Run Code Online (Sandbox Code Playgroud) 我有一个问题,为什么某个东西“一步一步”完成后为什么不能编译,而为什么“一步一步”完成却不能编译。我有三节课;
class Time {
int mTime;
int Time::getTimeAsUnix() const {return mTime;}
}
class Travel {
Time mTimestamp;
const Time& Travel::getTime() const { return mTimestamp; }
Time& Travel::getTime() { return mTimestamp; }
}
class Analysis : public Travel {
int Analysis::getUnixTime() const {
// Time& t = Travel::getTime();
// return t.getTimeAsUnix(); // This does NOT compile
return Travel::getTime().getTimeAsUnix(); // This compiles
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么在Analysis类中编译非注释方法,而注释方法却给我一个即时的“ C ++错误:尝试时将'const Time'绑定到类型'Time&'的引用时会丢弃限定符”吗?
两者执行时不是完全一样吗?
我有这门课:
class BankAccount{
private:
char* ownerName;
char IBAN[14];
double balance;
}
Run Code Online (Sandbox Code Playgroud)
我有这个功能:
char* BankAccount::getIban(){
return this->IBAN;
}
Run Code Online (Sandbox Code Playgroud)
那个有效,但我想知道为什么我不能这样定义getIban(),因为我想确保不能更改IBAN:
char* BankAccount::getIban()const{
return this->IBAN;
}
Run Code Online (Sandbox Code Playgroud)
它说 return value does not match the function type.
当我将一个const int数组传递给一个获取int数组的函数时,会出现编译器错误但是当我将一个int数组传递给一个获得const int数组的函数时就OK了.
为什么会这样?我认为错误的论点是编译器错误.
假设我在C中声明了这个变量:
const char*** const strings;
Run Code Online (Sandbox Code Playgroud)
现在如果我试试这个:
printf("character is : %c \n",***strings);
**strings="hello";
printf("strings is %s \n", **strings);
printf("character is : %c \n",***strings);
Run Code Online (Sandbox Code Playgroud)
有时,我得到以下输出:
character is :
strings is hello
character is : h
Run Code Online (Sandbox Code Playgroud)
但是有时我会得到一个段错误,因为(我假设)该指令
**strings="hello";
Run Code Online (Sandbox Code Playgroud)
我认为你可以用char* str = "hello";C语言编写,使str指向一个不可修改的字符串"hello".为什么这不适用于我的情况?任何人都可以解释为什么它不会给出相同的输出evertime?
我知道我不能写long& const x.但为什么不呢?从理论上讲,我可以对x进行持续的引用.我只是无法将引用设置为另一个地址.
为什么在C++中禁止它?
编辑:我知道有些东西我不明白,但我可以指定另一个变量的引用.这段代码有效:
#include <iostream>
int main()
{
int a = 1, b = 2;
int & x = a;
x = b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这与你所说的相矛盾.
我有这个代码,像往常一样,变量"local"的值保持不变,因为它是一个const.
const int local = 10;
int *ptr = (int*)&local;
printf("Initial value of local : %d \n", local);
*ptr = 100;
printf("Modified value of local: %d \n", local);
Run Code Online (Sandbox Code Playgroud)
虽然,当我将local设置为const volatile时,它会将local的值更改为100.为什么?
const volatile int local = 10;
int *ptr = (int*)&local;
printf("Initial value of local : %d \n", local);
*ptr = 100;
printf("Modified value of local: %d \n", local);
Run Code Online (Sandbox Code Playgroud)
我理解的volatile的唯一含义是它阻止编译器对该变量进行优化,以防它的值必须由外部元素更改.但我无法弄清楚如何以及为什么volatile会覆盖const的功能.
编辑 - 从所有答案看来,我的代码是模糊的,任何输出都是不可预测的,因为我正在调用未定义的行为.