C++ C++;-教授对类实例化的特定示例的困惑
我的教授给出了以下代码: Main.cpp 我在课堂上问过他这个问题,他说这是有效的C++,而且应该是可行的。我以前从未见过此类类实例化,它必须从字符串文本转换为C++ C++;-教授对类实例化的特定示例的困惑,c++,class,instantiation,C++,Class,Instantiation,我的教授给出了以下代码: Main.cpp 我在课堂上问过他这个问题,他说这是有效的C++,而且应该是可行的。我以前从未见过此类类实例化,它必须从字符串文本转换为std::string,然后将其转换为状态对象 我的教授接着指出,还有其他类似的调用非常接近: State y = "s2"; // Does NOT compile State y("s2"); // Does compile State y = string(
std::string
,然后将其转换为状态
对象
我的教授接着指出,还有其他类似的调用非常接近:
State y = "s2"; // Does NOT compile
State y("s2"); // Does compile
State y = string("s2"); // Does compile
这是怎么回事?为什么第一个不编译,而第二个和第三个编译?还有,我的教授说第一句话应该行得通,是不是说错了?还是编译器特有的行为?看起来您的
状态
对象有一个接受字符串
的构造函数。文本“s2”
是类型常量字符[3]
。这就是您收到错误的原因
它也是特定于编译器的。以下代码段适用于,但不适用于:
我们需要查看
state.h
只能应用一个用户定义的转换。我的教授接着指出,还有其他相当接近的调用是非常接近的。如果你认为“C++”不是“C++”的话,那么你的教授听起来就好像C++是他们的主要编程语言。如果不完全相同,则不完全相同。State y=“s2”代码>和状态y(“s2”)代码>不是等效的。第一个是“复制初始化”,第二个是“直接初始化”。最有可能的是,在教授的任何编译器设置上,它都会将其升级为字符串或其他非标准的向上转换,用于=
运算符。文本“s2”
是typeconst char[3]
,正如错误消息中明确规定的那样。此外,这个答案并不能解释为什么当对象采用字符串时,文本不起作用,我知道这是错误的。在我编译程序之前,我认为它是奇特的,并且不认为它是有效的C++。有没有人知道为什么我的教授会说它是有效的C++,应该编译?是否有允许此操作的编译器标志(如果有,它们是什么/我将在哪里查找该信息)?是否有其他编译器可以在其下工作(我知道他主要在自己的计算机上使用Red Hat,并且可能已经在那里进行了测试)?是的,可以。如果尚未定义const char*
赋值操作,则赋值运算符从字符串文字(const char*
到string
的隐式转换是特定于编译器的,const char*
赋值操作State st(“a”)
工作起来很奇怪,但是State st=“a”
没有,因此一些编译器可能允许它作为扩展,这是可以理解的。
#ifndef STATE_H
#define STATE_H
#include <string>
using namespace std;
class State
{
private:
string* name; // str pointer used for illustrative purposes
static int number_of_states;
public:
State();
State(string state_name);
State(const State& state); // Will basically be the copy constructor
virtual ~State();
State& operator=(const State& state); // Copy on equal
void get_name(string& state_name) const;
void set_name(string state_name);
static int total_number_of_states();
};
typedef State *State_pointer;
#endif
$ g++ example_main_1.cpp state.cpp
example_main_1.cpp: In function ‘int main(int, const char**)’:
example_main_1.cpp:14:12: error: conversion from ‘const char [3]’ to non-scalar type ‘State’ requested
State y = "s2"; // This doesn't compile
State y = "s2"; // Does NOT compile
State y("s2"); // Does compile
State y = string("s2"); // Does compile
struct State
{
State(string s) { }
};
int main() {
State s = "a";
}