如何返回一个对象
象
CString a;
CString b("123");
a = b + "456";
b+(cha *)怎么返回一个CString对象,而这个对象不是b。
a = CString这里也返回一个对象,但是a并没有通过参数方式传进出,最后怎么得到。
就象c语言中如果返回的是char*,我们一般都要事先分配好再传进去,最后返回,而这里的对象都没传进函数里,怎么返回个队象?
问题点数:50、回复次数:25Top
1 楼lightning(lightning)回复于 2001-12-19 12:14:06 得分 25
我想你对CString 不太了解
1.CString 的构造函数有类型转化功能.
2.看一下CString重载的=就明白了
CString& CSring :: operate = (const CString & other)
是通过引用传递的.
3.构造函数有类型转化功能,会创建临时对象Top
2 楼lightning(lightning)回复于 2001-12-19 12:19:23 得分 0
也就是说 由char* "456",程序使用构造函数创建一个CString c("456"),然后+,再free c.(你就不要担心了)
c即为临时对象. 自动创建与销毁Top
3 楼leizhengdeng(权为妞妞所用,利为妞妞所谋)回复于 2001-12-19 12:27:25 得分 0
我的意思是
CString& CSring :: operate = (const CString & other)
这样的函数(操作符重载也是函数)怎么写?
是通过引用传递的,具体点
class A
{
private:
int x;
int y;
public:
A& operate = (const A& a);
A& operate + (int add);
}
////////////////////////
A a(1,3);//这里省略了构造函数,就是a.x=1, a.y=3
A b;
b = a + 2;//我要b.x = 1+2 =3; b.y = 3+2 =5
现在问
A& operate = (const A& a);
A& operate + (int add);
怎么写?
Top
4 楼lightning(lightning)回复于 2001-12-19 12:55:22 得分 0
A& operate = (const A& a)
{
if(this != &a)
{
x=a.x;
y=a.y;
}
return *this;
}
A& operate + (int add)
{
x=x+add;
y=y+add;
return *this;
}
Top
5 楼leizhengdeng(权为妞妞所用,利为妞妞所谋)回复于 2001-12-19 13:17:24 得分 0
A a(1,3);//这里省略了构造函数,就是a.x=1, a.y=3
A b;
b = a + 2;//我要b.x = 1+2 =3; b.y = 3+2 =5
注意,运行这些代码後a.x还是1,a.y还是3
你上面的代码是把a,b作为同一对象,不行。
Top
6 楼leizhengdeng(权为妞妞所用,利为妞妞所谋)回复于 2001-12-19 13:34:02 得分 0
常写类的高手请帮帮忙Top
7 楼lightning(lightning)回复于 2001-12-19 13:55:01 得分 0
哈哈,不好意思忙着要午睡写错了
那个加成一元的了
A& operate + (A& a ,int add)
{
if(this!= &a)
{
x=a.x+add;
y=a.y+add;
}
else
{
x+=add;
y+=aadd;
return *this;
}
Top
8 楼lightning(lightning)回复于 2001-12-19 13:58:31 得分 0
tututu,
又错了
A& operate + (A& a ,int add)
{
if(this!= &a)
{
x=a.x+add;
y=a.y+add;
}
else
{
x+=add;
y+=aad;
}
return *this;
}Top
9 楼leizhengdeng(权为妞妞所用,利为妞妞所谋)回复于 2001-12-19 14:37:53 得分 0
出现binary 'operator +' has too many parameters??Top
10 楼LXJ2001(lxj)回复于 2001-12-19 15:15:44 得分 5
CTest::CTest()
{
x = 0;
y = 0;
}
CTest::CTest(int n)//这很关键
{
x = n;
y = n;
}
CTest::CTest(int nX,int nY)
{
x = nX;
y = nY;
}
CTest::~CTest()
{
}
CTest& CTest::operator = (const CTest& a)
{
if(this != &a)
{
x=a.x;
y=a.y;
}
return *this;
}
CTest& CTest::operator + (const CTest& a)
{
x+=a.x;
y+=a.y;
return *this;
}
Top
11 楼leizhengdeng(权为妞妞所用,利为妞妞所谋)回复于 2001-12-19 15:26:01 得分 0
不行,你这样的意思是
CTest = CTest + CTest;
而不是
CTest = CTest + int;
Top
12 楼LXJ2001(lxj)回复于 2001-12-19 15:29:50 得分 0
对呀,我觉得CTest + int,应该把int先转换成CTestTop
13 楼leizhengdeng(权为妞妞所用,利为妞妞所谋)回复于 2001-12-19 15:34:00 得分 0
不符合我的本意
我的意思是
CTest a(1,2)
CTest b;
b = a + 200;
a, b运行后不相同的。
Top
14 楼lightning(lightning)回复于 2001-12-19 15:45:04 得分 0
const A A:: operator+(const int add)
{
A c;
c.x = x +add;
c.y = y +add;
return c;
}
Top
15 楼lightning(lightning)回复于 2001-12-19 15:45:54 得分 0
不能返回引用了Top
16 楼lightning(lightning)回复于 2001-12-19 15:48:06 得分 0
or
friend const A operator+(const A& a,const int add);
const A operator+(const A& a,const int add)
{
A c;
c.x=a.x+add;
c.y=a.y+add;
return c;
}
Top
17 楼wwwjjf(让我呵呵你吧)回复于 2001-12-19 15:59:48 得分 0
gz!!!!Top
18 楼aauhii(快秃顶了)回复于 2001-12-19 16:01:28 得分 20
to;leizhengdeng(E-农民)
1. 关键字是operator 吧,或者operate 有什么用法,小弟不知。
2。重载+这类运算符一般pass by value, 不是pass by reference ,
出现'operator +' has too many parameters?? 我觉得是上边大虾的做法应该声明为friend 吧。
3。不明白你的意图,b= a+2, 你是要a保持呢还是要a也+2呢,我写的是a不变的
class A
{
public:
int x;
int y;
A(int a=0, int b=0): x(a), y(b) {}
A& operator=(const A& a);
A operator+(int add);
};
A& A::operator = (const A& a)
{
if(this != &a)
{
x = a.x;
y = a.y;
}
return *this;
}
A A::operator + (int add)
{
return A(x+add, y+add);
}
main()
{
A a(1,3);
A b;
b= a+2;
std::cout<<"this is b"<<b.x<<" "<<b.y<<std::endl;
std::cout<<"this is a"<<a.x<<" "<<a.y<<std::endl;
return 0;
}
4。从别的贴子上看到你说关于栈和堆地址范围的高见,不知那里看的,还是自己跟踪的,谢谢指教。
Top
19 楼aauhii(快秃顶了)回复于 2001-12-19 16:02:56 得分 0
to;leizhengdeng(E-农民)
1. 关键字是operator 吧,或者operate 有什么用法,小弟不知。
2。重载+这类运算符一般pass by value, 不是pass by reference ,
出现'operator +' has too many parameters?? 我觉得是上边大虾的做法应该声明为friend 吧。
3。不明白你的意图,b= a+2, 你是要a保持呢还是要a也+2呢,我写的是a不变的
class A
{
public:
int x;
int y;
A(int a=0, int b=0): x(a), y(b) {}
A& operator=(const A& a);
A operator+(int add);
};
A& A::operator = (const A& a)
{
if(this != &a)
{
x = a.x;
y = a.y;
}
return *this;
}
A A::operator + (int add)
{
return A(x+add, y+add);
}
main()
{
A a(1,3);
A b;
b= a+2;
std::cout<<"this is b"<<b.x<<" "<<b.y<<std::endl;
std::cout<<"this is a"<<a.x<<" "<<a.y<<std::endl;
return 0;
}
4。从别的贴子上看到你说关于栈和堆地址范围的高见,不知那里看的,还是自己跟踪的,谢谢指教。
Top
20 楼leizhengdeng(权为妞妞所用,利为妞妞所谋)回复于 2001-12-19 16:10:41 得分 0
还是不行Top
21 楼leizhengdeng(权为妞妞所用,利为妞妞所谋)回复于 2001-12-19 16:16:15 得分 0
我的目的是这样的
告诉你一个日期,比如公元4年2月29日,问89324234天後是什么日子?
要求自己写个类:最后形式如下:
CDate a(4,2,29);
CDate b;
b = a + 89324234;
要求保留a和b
Top
22 楼lightning(lightning)回复于 2001-12-19 16:19:57 得分 0
yes.
A A::operator + (int add)
{
return A(x+add, y+add);
}
is better than
const A A:: operator+(const int add)
{
A c;
c.x = x +add;
c.y = y +add;
return c;
}
operate 是写错的,我copy过来的,如果你关心这个也没有办法.
重载+这类运算符一般pass by value, 不是pass by reference
pass by reference 比pass by value 要少一次对象的构造与析构(just like your code runs more qk),看情况而定了
Top
23 楼leizhengdeng(权为妞妞所用,利为妞妞所谋)回复于 2001-12-19 16:44:28 得分 0
to :aauhii(菜鸟)
//4。从别的贴子上看到你说关于栈和堆地址范围的高见,不知那里看的,还是自己跟踪的,谢谢指教。
我自己跟踪的Top
24 楼leizhengdeng(权为妞妞所用,利为妞妞所谋)回复于 2001-12-19 16:48:12 得分 0
能给个具体的例子吗?
Top
25 楼aauhii(快秃顶了)回复于 2001-12-19 19:41:17 得分 0
说各位写了operate没有别的意思,只是刚学,以为有新的用法我上不知道,所以讨教的。
写错了,不是pass by reference , 我的意思是最好传回临时对象副本而不是引用。
是从Effective C++ 条款23看的,不只用的对不对。
Top




