C++中怎么把对象指针转换为对象?

learnboy007 2010-12-02 08:25:34
如题,是否是要重载类型转换呢?各位说说看。怎么实现?
...全文
2408 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
FengRider 2010-12-03
  • 打赏
  • 举报
回复
楼主是从JAVA还是C#转过来的?
在C++中,如果你要在堆里面给对象分配空间,是先定义一个对象指针,然后将分配的空间地址赋给对象指针。
如果你定义的是一个对象,则系统按你定义对象的地方为其分配相应的空间,在函数外面为在全局区分配一个对象空间,在函数或者循环体里面则在栈里面为其分配空间。
象 Book b;则是在栈里面分配了一个Book的对象,对象名是b
new Book这个表达式的意思是在堆里面分配一个Book对象的空间,并调用其无参构造函数初始化该对象空间
Book *bp这个表达式则是定义一个Book的对象指针,仅这一句并不会分配Book的对象空间出来。
Book *bp = new Book;这样的一句表达式,则是定义一个对象指针bp,同时在堆里面分配一个对象空间,然后让bp指向刚分配的对象空间。bp指针和对象空间的生存期可是不同的,bp在函数内定义,只在函数内部生存,函数结束bp的生命就结束,但对象空间是在堆里面,程序员不主动释放,会一直在使用这个对象空间的进程结束再由操作系统收回。
b = *bp; 这一句是毫无疑问通不过的。系统自带的=操作符不能进行对象的赋值操作,需要你自己重载=操作符,让系统能够知道=对于Book对象应该是如何操作的。
pengzhixi 2010-12-03
  • 打赏
  • 举报
回复
最好的办法就是用java c++不是用来玩这个的
hastings 2010-12-03
  • 打赏
  • 举报
回复
怎么跟java搞混了~~
gules 2010-12-03
  • 打赏
  • 举报
回复
如果要让
A a = new A; 生效,在类A中加入如下构造函数:
A::A(const A* rhs) // 注意,一定不能加explicit,否则不能进行隐式转换
{
……
}
如果要让 A b; A * a = new A; b = a; 生效,需要(非正式形式)重载=操作符:
A& A::operator=(const A* rhs)
{
……
return *this;
}
bluewanderer 2010-12-03
  • 打赏
  • 举报
回复
回17楼,我其实只是顺便添乱的,所以格式都没用。

“=”默认会调用对应的构造方法而已,其他什么都不会变。如果想a->x只能重载->运算符。
一根烂笔头 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 bluewanderer 的回复:]
struct A
{
A(int x) : x(x)
{
}

A(A *in_src)
{
*this = *in_src;
}

int x;
};

int main()
{
A a(1);
A *b = new A(2);

a = b;
}
[/Quote]


#include <iostream>
using namespace std;

struct code
{
code(int x):x(x){}

code(code *in_src)
{
*this = *in_src;
}
int x;
};

int main()
{
code a(1);
cout<<a.x<<endl;
code *b = new code(2);
cout<<b->x<<endl;
a = b;
cout<<a.x<<endl;//这个为什么不是cout<<a->x<<endl;
cout<<b->x<<endl;
}


bluewanderer 2010-12-03
  • 打赏
  • 举报
回复
struct A
{
A(int x) : x(x)
{
}

A(A *in_src)
{
*this = *in_src;
}

int x;
};

int main()
{
A a(1);
A *b = new A(2);

a = b;
}
zanglengyu 2010-12-03
  • 打赏
  • 举报
回复
string* p;
static_cast<string>(p)
string* 转换为 string
yby4769250 2010-12-02
  • 打赏
  • 举报
回复
我觉得应该重载operator=操作符,参数为对象的指针类型
mstlq 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sghdls 的回复:]
我只能这么改, 但是也改变了 b= bp; 这句话: 编译成功



C/C++ code
class Book
{
int id;
public:

};

int main()
{
Book b;
Book *bp = new Book;
b = *bp; // 可以想办法让这句通过编译吗?通过在类中加入一些函数
……
[/Quote]
重载operator new就可以了……
具体操作请google
dingshaofengbinbin 2010-12-02
  • 打赏
  • 举报
回复
你是要转换的内部原理吗??建议看一下对象模型!!
sghdls 2010-12-02
  • 打赏
  • 举报
回复


我只能这么改, 但是也改变了 b= bp; 这句话: 编译成功

class Book
{
int id;
public:

};

int main()
{
Book b;
Book *bp = new Book;
b = *bp; // 可以想办法让这句通过编译吗?通过在类中加入一些函数
return 0;
}



就想叫yoko 2010-12-02
  • 打赏
  • 举报
回复
Book bp = new Book;这句能通过编译?
sghdls 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 learnboy007 的回复:]

不是这个意思。这么说吧。假如我有一个Book类
C/C++ code

class Book
{
int id;
public:

};

int main()
{
Book b;
Book bp = new Book;
b = bp; // 可以想办法让这句通过编译吗?通过在类中加入一些函数
return 0;
}
[/Quote]

如果不改变逻辑结构,光在类上改的话, 我无能为力.

只能帮你顶一下了~
learnboy007 2010-12-02
  • 打赏
  • 举报
回复
不是这个意思。这么说吧。假如我有一个Book类

class Book
{
int id;
public:

};

int main()
{
Book b;
Book bp = new Book;
b = bp; // 可以想办法让这句通过编译吗?通过在类中加入一些函数
return 0;
}

sghdls 2010-12-02
  • 打赏
  • 举报
回复


用解引用标识符: *


给楼主一个代码例子:

#include <iostream>
#include <string>

using namespace std;

int main(){

string str = "abc";
string *ps;
ps = &str; //把 str对象的地址赋值给指针ps
cout<<*ps<<endl; //这就是把指向string对象的指针对其'解引用'转换为对象str.
//结果输出 abc
}
learnboy007 2010-12-02
  • 打赏
  • 举报
回复
是隐式转换的那种
ewrscsf 2010-12-02
  • 打赏
  • 举报
回复
啊?!那是怎么样完成的啊?还希望详细解释下了,这个问题实在是不懂诶
谢谢了啊
码农心语 2010-12-02
  • 打赏
  • 举报
回复
对象指针变成对象就是用 * 来完成啊。

64,691

社区成员

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

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