"abc"的类型为什么不是const char*解决方案
"abc"的类型为什么不是const char*?
以上代码VC6下输出为:
non-const
为什么?
------解决方案--------------------
history dramatic
------解决方案--------------------
可能跟编译器有关,在VC7下面输出为const。不知道哪位能在linux下面跑跑看什么结果。
------解决方案--------------------
"abc", 也就是常量字符串,在C/C++中它的类型是 const char [] ,也就是常量字符数组。
------解决方案--------------------
验证过了,在FC7中是const,that make sense!
------解决方案--------------------
风格不好,应该是:
int main()
^_^..
------解决方案--------------------
vs2005是const,和编译器有关吧
------解决方案--------------------
我在vs2008中结果是:const
前提是:int main()
如果是main()
则编译有一个错误..
------解决方案--------------------
好像是和编译器有关
------解决方案--------------------
VC6不知道是否是const,把MyClass(char* str)删了也能正常编译,结果就是const。
------解决方案--------------------
反正几本讲解C++的权威书(《C++程序设计语言》《C++Primer》第三版)就说程序里的文字量形如"abc"的就是 const char [] 类型
------解决方案--------------------
DEVC++ 下的结果也是 CONST 和编译器有关吧
------解决方案--------------------
"abc" 就是const char[]类型 严格的说是char[3]类型!
------解决方案--------------------
C的遗传问题。
------解决方案--------------------
编译器相关,看定义的字符串是否为常量了
------解决方案--------------------
MyClass obj("abc"); //调用的构造函数是MyClass(char *str),因为参数"abc"是按值传递的,调用构造函数前会创建个临时变量存储"abc",且该临时变量不是const类型
------解决方案--------------------
如果想调用构造函数MyClass(const char* str),必须明确定义const变量
const char* cstr = "abc";
MyClass obj(cstr);
------解决方案--------------------
基本上老点的编译器都将它视作non-const,TC还允放直接修改它.
------解决方案--------------------
这是兼容旧语言标准遗留问题,你可以看作是C++语言的一个小bug
计算机等级考试的标准太低:)国内的等级考试要求都很低的
我们应该写出风格好的代码,而不要利用bug
至于你说的那个函数,即使他不是const char*,理论上也绝对不需要强制转换
应该说他是const char [],但是编译器需要的是const char*,这是指针和数组的差别
------解决方案--------------------
计算机等级考试,我都没有考过它,照样编程。呵呵!
------解决方案--------------------
没次看大家的帖子都能学到点东西.学习中
- C/C++ code
#include <iostream> using namespace std; class MyClass { public: MyClass(const char* str) { cout << "const\n"; } MyClass(char *str) { cout << "non-const\n"; } }; main() { MyClass obj("abc"); return 0; }
以上代码VC6下输出为:
non-const
为什么?
------解决方案--------------------
history dramatic
------解决方案--------------------
可能跟编译器有关,在VC7下面输出为const。不知道哪位能在linux下面跑跑看什么结果。
------解决方案--------------------
"abc", 也就是常量字符串,在C/C++中它的类型是 const char [] ,也就是常量字符数组。
------解决方案--------------------
验证过了,在FC7中是const,that make sense!
------解决方案--------------------
风格不好,应该是:
int main()
^_^..
------解决方案--------------------
vs2005是const,和编译器有关吧
------解决方案--------------------
我在vs2008中结果是:const
前提是:int main()
如果是main()
则编译有一个错误..
------解决方案--------------------
好像是和编译器有关
------解决方案--------------------
VC6不知道是否是const,把MyClass(char* str)删了也能正常编译,结果就是const。
------解决方案--------------------
反正几本讲解C++的权威书(《C++程序设计语言》《C++Primer》第三版)就说程序里的文字量形如"abc"的就是 const char [] 类型
------解决方案--------------------
DEVC++ 下的结果也是 CONST 和编译器有关吧
------解决方案--------------------
"abc" 就是const char[]类型 严格的说是char[3]类型!
------解决方案--------------------
C的遗传问题。
------解决方案--------------------
编译器相关,看定义的字符串是否为常量了
------解决方案--------------------
MyClass obj("abc"); //调用的构造函数是MyClass(char *str),因为参数"abc"是按值传递的,调用构造函数前会创建个临时变量存储"abc",且该临时变量不是const类型
------解决方案--------------------
如果想调用构造函数MyClass(const char* str),必须明确定义const变量
const char* cstr = "abc";
MyClass obj(cstr);
------解决方案--------------------
基本上老点的编译器都将它视作non-const,TC还允放直接修改它.
------解决方案--------------------
这是兼容旧语言标准遗留问题,你可以看作是C++语言的一个小bug
计算机等级考试的标准太低:)国内的等级考试要求都很低的
我们应该写出风格好的代码,而不要利用bug
至于你说的那个函数,即使他不是const char*,理论上也绝对不需要强制转换
应该说他是const char [],但是编译器需要的是const char*,这是指针和数组的差别
------解决方案--------------------
计算机等级考试,我都没有考过它,照样编程。呵呵!
------解决方案--------------------
没次看大家的帖子都能学到点东西.学习中