初涉C++再请大家答疑解惑

匚匚 2011-02-09 02:25:47
1、这种说法对吗?为什么?
类的数据成员不能包括动态分配的数据?(出自某教授书籍)
2、重载能否实现连加?可以的话如何实现?
如 C=C1+C2+C3;
3、类外的普通函数作为重载运算符函数与类的成员函数作重载函数有何不同,如何运作?
...全文
216 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪人2015 2011-02-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhw952 回复:]
有一说一

第一个问题,看来是我钻了牛角尖,可以把动态分配的数据的起始地址赋给一个指针或引用

另四楼老师的:
class A{
int b; //这个没显示标明的是不是私有的?
public:
A(int b):b(b){}
A operator+(const A& a) //函数的返回值类型为类A
{
return new A(b+a.b); //返回的却是一个指向类A的一个指针吧?
}
}
[/Quote]

是的,类的默认访问权限是private。如果类内声明成员函数或是成员变量,没有访问权限说明符,那么都是用默认访问权限,类继承也是。如:
class B:A
{};
那么B是私有继承基类A的。

另外再说一点,结构体和类几乎几乎完全相同。只有默认访问权限不一样。结构体的默认访问权限是public。
xgy8705023 2011-02-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bdmh 的回复:]
1、这种说法对吗?为什么?
类的数据成员不能包括动态分配的数据?(出自某教授书籍)
我感觉要表达的意思是不能初始化成员变量吧

2、重载能否实现连加?可以的话如何实现?
如 C=C1+C2+C3;
实现+的重载,至于里面怎么加,你自己定

3、类外的普通函数作为重载运算符函数与类的成员函数作重载函数有何不同,如何运作?
类外需要两个参数,类内需要一个参数,隐含一个this……
[/Quote]
4楼正解
eagleql 2011-02-11
  • 打赏
  • 举报
回复
我认为第一个问题的说法是对的。
类的数据成员不能包括动态分配的数据。他想表明的意思应该是:动态分配的数据不应该是类的数据成员。

因为当类对象销毁后,类中的数据成员也一并被销毁,但是动态分配的数据是不会被销毁的,需要我们手动释放掉。
正因为动态分配的数据不会随着类对象的销毁而销毁,所以认为他不应该是类的数据成员也是可以这样理解的。
  • 打赏
  • 举报
回复
其实按原话我还真没明白什么意思
按四楼的说法理解的,但四楼的结论。。。
  • 打赏
  • 举报
回复
关于第一个问题


#include <iostream>
using namespace std;

class AA
{
public:
int& m_val;

AA() : m_val(* new int) {}
};

int main(int argc, char* argv[])
{
{
AA a;
a.m_val = 10;
cout<<a.m_val;
delete &a.m_val;
}

return 0;
}
tulipcaicai 2011-02-11
  • 打赏
  • 举报
回复
学习了,我遇到过后两个问题。
InfidelX 2011-02-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bdmh 的回复:]

1、这种说法对吗?为什么?
类的数据成员不能包括动态分配的数据?(出自某教授书籍)
我感觉要表达的意思是不能初始化成员变量吧

2、重载能否实现连加?可以的话如何实现?
如 C=C1+C2+C3;
实现+的重载,至于里面怎么加,你自己定

3、类外的普通函数作为重载运算符函数与类的成员函数作重载函数有何不同,如何运作?
类外需要两个参数,类内需要一个参数,隐含一个thi……
[/Quote]
正解。
匚匚 2011-02-10
  • 打赏
  • 举报
回复
书上说可以将普通函数(非成员函数,非友元函数)作为重载运算符函数,不知道是怎么实现的?
kongzhitai 2011-02-09
  • 打赏
  • 举报
回复
new返回指针还是对象的副本?
匚匚 2011-02-09
  • 打赏
  • 举报
回复
有一说一

第一个问题,看来是我钻了牛角尖,可以把动态分配的数据的起始地址赋给一个指针或引用

另四楼老师的:
class A{
int b; //这个没显示标明的是不是私有的?
public:
A(int b):b(b){}
A operator+(const A& a) //函数的返回值类型为类A
{
return new A(b+a.b); //返回的却是一个指向类A的一个指针吧?
}
}


iambic 2011-02-09
  • 打赏
  • 举报
回复
不知道1是啥意思,是出书的教授不懂得说中国话,还是你自己断章取义了?
雪人2015 2011-02-09
  • 打赏
  • 举报
回复
1:第一个说法是对的
动态分配的数据我们都是没法直接拥有的,是通过系统开辟,我们用指针来管理的。所以我们的类成员没有是动态分配的,而只能说有能控制动态分配的指针。
2:一般的标准操作的重载写法都可以实现接连运算,因为一般的标准的操作符返回都是对象或对象引用。
一个简单那的例子。
class A{
int b;
public:
A(int b):b(b){}
A operator+(const A& a)
{
return new A(b+a.b);
}
}

即可实现连加。

3:类外的普通的和类的友元函数都必须把操作符的两端数据作为参数进行传递。
而类内的只需要把一端的(通常右端)作为参数。
所以以上面我举的例子为例:
如果是类外的话,那就这样写:
A operaotr+(const A& a,int b);
如果是类友元的话,那就这样写:
friend A operator+(const A& a,int b);(就是多了一个friend关键字)
bdmh 2011-02-09
  • 打赏
  • 举报
回复
1、这种说法对吗?为什么?
类的数据成员不能包括动态分配的数据?(出自某教授书籍)
我感觉要表达的意思是不能初始化成员变量吧

2、重载能否实现连加?可以的话如何实现?
如 C=C1+C2+C3;
实现+的重载,至于里面怎么加,你自己定

3、类外的普通函数作为重载运算符函数与类的成员函数作重载函数有何不同,如何运作?
类外需要两个参数,类内需要一个参数,隐含一个this指针
qq120848369 2011-02-09
  • 打赏
  • 举报
回复
1,没法说
2,friend const Obj operator +(const Obj &a,const Obj &b);
3, 友元与成员函数的区别。
匚匚 2011-02-09
  • 打赏
  • 举报
回复
有实例更好了,给大家拜个晚年

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧