原谅我,我的C ++非常生疏。但我试图采取一些旧代码并在Visual C ++ 2008下重新编译它。它最初是为Visual C ++ 6.0编写的
我得到的错误是:
错误C4430:缺少类型说明符 - 假设为int。注意:C ++不支持default-int
好吧看起来很简单。但接下来我会看一下令人讨厌的代码:
operator=(int i) {SetAsInt(i);};
似乎声明了IS类型。那我错过了什么?
关注:
我接受了Micheals的建议并添加了函数的返回类型(类),并添加了将此返回; 添加到每个函数的末尾。然后我碰到了这个:
operator=(const CString& str);
没有定义函数体......究竟是什么意思?
答案 0 :(得分:7)
你需要让operator=()
方法返回一些东西(如果诊断不是错误,它会假定为int,因为错误信息有点令人困惑地表示)。
通常它是对运算符正在处理的对象的引用,因此可以像在正常赋值表达式中一样链接赋值。类似的东西:
// where T is the class for this operator= implementation
T& operator=( int i) {
// ...
return *this;
}
答案 1 :(得分:3)
正如迈克尔所说,operator =需要一个返回类型,但这种类型可能是无效的:
class A {
...
void operator = ( int i ) {
SetAsInt(i);
}
};
虽然这意味着您将无法进行“菊花链”分配。
关于后续行动,可能会说禁止上课:
class B {
private:
void operator =( const B & );
};
将赋值op(通常是copy ctor)设为私有,然后不实现它们意味着不可能分配(或复制)类实例,这对于大多数面向业务的类来说是理想的行为。
答案 2 :(得分:2)
对于第二个问题,声明就像用于防止复制对象一样。
来自the C++ Reference Guide by Danny Kalev
问题:如何防止 对象的复制?
答案:声明复制构造函数 和赋值运算符为私有 成员,没有定义它们。任何 声明涉及直接或 间接复制该类将 导致编译错误。这个 技术并不完全是图片 优雅,但在当代C ++ 没有其他方法可以阻止复制 廉价。
答案 3 :(得分:2)
关于你的编辑: 它只是表示函数已声明,但未定义。编译器知道它存在,因此调用它是合法的。但它会产生一个链接器错误,除非编译器实际上能够在某处找到主体。
通常,您在头文件中定义函数,然后在.cpp文件中,您有类似
的内容// Assuming the class it is a member of is called Foo
Foo& Foo::operator=(const CString& str) {
...
}
这里唯一需要注意的是Foo ::前缀。因为这个定义不在类定义本身之内,所以我们必须使用这个前缀来指定operator =我们定义的属于Foo类。
答案 4 :(得分:2)
返回ANYTHING但是lval通常是错误的,仅在非常特殊的情况下使用
当然返回一个const引用会排除赋值链接(a =(b = c)),而运算符的一部分就是使类的行为类似于内置类型
答案 5 :(得分:1)
嗯,那是一个赋值算子。它有助于定义如何将其他对象(包括相同类型和其他类型)分配给它所定义的类的实例。
正确的语法是(假设您的类名为'Object'):
const Object& operator=(const Object& other)
{
// copy members, one at a time.
this->member1 = other.member1;
return *this;
}
请注意,返回类型是常量。这是为了避免语义错误,语法正确的语句,如:
Object A, B, C;
(A = B) = C;
如果你将返回类型定义为常量,上面的代码将无法编译(合理的,因为它真的搞砸了),而省略const将允许这样的错误代码编译,当然有人会拉他们的头发尝试找出问题所在。
P.S。您可能想要考虑一下:如果从返回类型中省略const并执行(A = B)= C,会发生什么?码?
答案 6 :(得分:1)
关于后续问题,在这种情况下,返回类型可以是任何内容。但是,由于大多数赋值运算符都返回对它们声明的类的引用,因此最好只返回它,以免混淆读者。
CString& operator=(const CString& str);
据推测,此函数在类的private
部分中声明。这是使类的对象不可赋值的标准习惯用法。