effective C++ 条款24的有关问题
effective C++ 条款24的问题#include iostream#include nonMember.husing namespace stdvoid main(){
effective C++ 条款24的问题
#include <iostream>
#include "nonMember.h"
using namespace std;
void main()
{
cout<<"Hello world"<<endl;
nonMember nm1(10);
nonMember nm2(100);
nonMember nm3 = nm1*nm2;
cout<<"nm3:"<<nm3.getIFlag()<<endl;
int i = 2;
nonMember nm4 = i * nm1;
cout<<"nm4:"<<nm4.getIFlag()<<endl;
}
#include "nonMember.h"
nonMember::nonMember(int i):iFlag(i)
{
}
nonMember::~nonMember(void)
{
}
//const nonMember operator* ( const nonMember & nonM, const nonMember & nonM1)
//{
//return nonMember(((nonMember &)nonM).getIFlag()*((nonMember &)nonM1).getIFlag());
//}
nonMember operator* (nonMember & nonM, nonMember & nonM1)
{
return nonMember(nonM.getIFlag()*nonM1.getIFlag());
}
#pragma once
class nonMember
{
public:
//explicit nonMember(int i);
nonMember(int i);
~nonMember(void);
const int getIFlag()
{
return this->iFlag;
}
private:
int iFlag;
};
/*const nonMember operator* ( const nonMember & nonM, const nonMember & nonM1)*/;
nonMember operator* (nonMember & nonM, nonMember & nonM1);
我实现了如上的代码,但是VS编译报错 error C2678:,请问是为什么。 但是如果把这个non-memeber函数的实现换成注释掉的部分,就能正确执行。 另外 如果operator* 的实现部分,不用强制类型转换((nonMember &))就会报错,请问是为什么?
[解决办法]#include <iostream>
#include <string>
using namespace std;
void print(string& a){ //这里也会报错,原因是一样的
cout<<a<<endl;
}
void main()
{
print("aaa");
}
[解决办法]参数加上const
nonMember nm4 = i * nm1;这里产生临时变量,&是无法引用到的。const &做参数才行
[解决办法]1.写的什么狗屁代码,基础学好了再来;
2.别人帮助你,你应当感激,别搞得跟悬赏一样,你不是面试官,OK?
[解决办法]i肯定是临时的nonMember,如果不是,请指出它的实体在哪里。
既然你在看《Effective C++》,《More Effective C++》也应该有吧,条款19:了解临时对象的来源,解释的很清楚了。如果还不懂,最好先看看《C++ Primer》把基础打扎实。
至于你这段代码的错误,我在7楼写过了。
[解决办法]7楼正解,第一你需要对operator*函数的两个参赛做const限定,因为只有用const引用做形参的函数才接收需要类型转换才能与形参完全匹配的实参,有点绕哈,换句话说,你用nonMember& nonM作为形参的话,你传递一个int型实参,这个int型数据是不会自动转换为nonMember类型的,这种调用是不合法的,只有用const nonMember& nonM型形参才能传递int型实参调用operator*函数。第二,由于nonMember是const的,那么在operator*函数中调用的nonMember的成员函数也必须是const的,所以你必须给getIFlag函数加上const限定