C++ 为什么编译器允许使用字符串而不允许使用int?
我只是想检查编译器是否允许类型名作为变量名。 当我试着C++ 为什么编译器允许使用字符串而不允许使用int?,c++,types,C++,Types,我只是想检查编译器是否允许类型名作为变量名。 当我试着 int int; #include <string> using namespace std; int main() { string string; } 它报告了一个错误,说 错误C2632:“int”后跟“int”是非法的 但是当我试着 int int; #include <string> using namespace std; int main() { string string;
int int;
#include <string>
using namespace std;
int main()
{
string string;
}
它报告了一个错误,说
错误C2632:“int”后跟“int”是非法的
但是当我试着
int int;
#include <string>
using namespace std;
int main()
{
string string;
}
它的工作原理类似于类的构造函数。
string
不是a,但int
是,并且保留字不能用作标识符
在语法上,类名和对象名相同是很好的
class test {};
int main() {
test test; // test is an object of type test.
}
int
是一个关键字,而string
是标准库中类的名称,但不是关键字。string
实际上与int
不是同一意义上的“数据类型”int
是“本机类型”,因此,文本“int”是一个关键字
<代码> String 只是一个“用户定义”类(虽然这里的“用户”被定义为C++标准提交者)。但就其本身而言,“string”不是一个关键字
因此,
int
是两个关键字,但是string-string
只是定义了一个名为“string”的变量,类型为“string”。C++编译器可以保持“字符串”的两种独立的使用(但这不是一个好主意,因为正如你所展示的,程序员通常不能)。<> > P>代码> int /代码>是C++关键字。在第二个声明中,“string string”声明了一个类型为“std::string”
的对象。在此之后,名称“string”在非限定查找中隐藏'std::string'
#include <string>
using std::string;
int main(){
string string;
string s; // Error
}
#包括
使用std::string;
int main(){
字符串字符串;
字符串s;//错误
}
好吧,鉴于其他人基本上已经发布了答案,我将继续发布我的意思
我假设因为第二个答案是编译的,所以您使用了名称空间std文件中的代码>(这通常不是一个好主意;我不明白为什么人们会告诉C++用户开始这样做)。
当编译器解析第一个字符串
时,它能够在名称空间std
中找到该类。string的第二个用法就是变量的名称。编译器允许基元类型的行为与模板中的类类似-如果必须在任何地方专门化基元,那将是一场噩梦。尝试删除
#include <string>
#包括
你的课程包括哪些内容?我会让对标准课程有更多经验的人回答这个问题,但本质上,int
是一个关键词,而string
是一个类。不幸的是,由于这是家庭作业,我不知道不给出答案我能帮上什么忙。也就是说,我认为任何分配这样一个问题的讲师都需要为我们这些不是语言律师的人上一堂关于合理问题的课
是初始化,相当于int a=10代码>注意:很好,但是如果你在真正的代码中这样做,任何维护者都会杀了你;)+1这个答案是正确的,但我不同意“类名和对象名相同很好”。标准可能允许这样做,但它不是很“好”,它甚至可以说classtest{};试验“类测试{}测试”也更糟:注意第一个用法(<代码>字符串Stry<代码> > >只有<代码> >代码> <代码>,其中包含< /代码> d和<代码>使用命名空间STD;<代码>存在于文件中。@BillyONeal:或使用std::string
:)