this 指针可以被用来修改其指向的类对象也可以用同一类型的新对象覆盖该对象例
如下面是类classType 的成员函数assign() 你能说明它的功能吗
classType& classType::assign( const classType &source )
{
if ( this != &source )
{
this->~classType();
new (this) classType( source );
}
return *this;
}
记住~classType()是析构函数的名字new 表达式看起来可能有点滑稽但是我们已经
在8.4 节看到过这种被称为定位new 表达式placement new expression 的new 表达式
你对这种编码风格有何看法你认为这是一种安全的操作吗?为什么?这个作业题,哪位给解释下?个人不喜欢这种编码风格。
如下面是类classType 的成员函数assign() 你能说明它的功能吗
classType& classType::assign( const classType &source )
{
if ( this != &source )
{
this->~classType();
new (this) classType( source );
}
return *this;
}
记住~classType()是析构函数的名字new 表达式看起来可能有点滑稽但是我们已经
在8.4 节看到过这种被称为定位new 表达式placement new expression 的new 表达式
你对这种编码风格有何看法你认为这是一种安全的操作吗?为什么?这个作业题,哪位给解释下?个人不喜欢这种编码风格。
解决方案 »
- tab中对话框如何相应菜单命令
- [求助]如何实现不定个数形参的传递?
- 我是做单机游戏的
- 如何将picture 中的图片拖到另一个picture控件中?
- ID_FILE_SAVE_AS是不是不能在CChildFrame中处理只能在CDocument中处理?
- 可否在macro中使用预处理指令?
- OPENGL中怎样给auxWireCube(1.0)的立方体的表面填充颜色?
- 如何让我的子进程只能在主进程中启动?在线高分
- 硬盘格式化后,数据怎么恢复,使用什么软件(急)
- 在VC中,如何编写Makefile,及如何用 .mak 文件编译,联接程序(来者有分)
- 视频抓屏问题(不禁用加速)
- 有谁用过skin美化....求救.....
this->~classType();这个不安全,考虑类继承的话。换成 delete this;
拷贝构造函数抛出异常?除非有明确的实现,默认应该不可能吧。
这句是什么意思?求高手解释
delete this 才会不安全吧!
如果类有继承关系,那么使用虚析构函数的话,直接如此显式调用析构函数仍然可以保证正确的调用。
相反如果this是在stack上分配的,delete只会导致出错。这还不提效率的问题。
定位放置(placement)new ,就是new不再管你的空间分配,而是直接使用你传进来的指针指向的空间。(这里是this)整个代码就是为了让assign不再有重新分配的开销吧,搞的如此别扭。隐患的话就是构造可能的异常抛出了。
感觉这里
this->~classType();
这里是不能用delete的.因为delete会释放资源
然后
new (this) classType( source );
就没有存储空间了.
所以要保证析构函数和拷贝构造不异常。1楼已经说的很好了。
如果析构函数是虚的,而assign不是虚的,那在特殊情况下还会导致对象“变质”,这里“变质”是什么意思,析构函数调用不完全?特殊情况是?
1、析构函数不是virtual的;
2、类声明中有需要深拷贝的情况。
2.1 如果该类用于多态,其析构函数必然为 virtual, 否则这是一个不合格的 C++ 程序员 2.2 assign 不是虚函数 从现实意义这个角度来讲,其不应该设计为虚函数。在这种情况下,类似于下面的调用 pa->assign( xx ) 是不合理的。 2.3 assign 为虚函数。在这种情况下没有任何问题。
当时只想着直接调用 this->~classType(); 如果继承基类的析构函数不是虚的话,会不被调用。专门写了个代码,进行测试。结果是即便基类的析构函数不是虚的,直接调用继承类的析构函数,基类的析构函数也会被调用。最开始看到的时候,以为是一段很有技巧的深拷贝函数。不过,根椐代码的测试情况,浅拷贝都谈不上。测试代码:(vs2010)class TestBase
{
private:
protected:
public :
int m_nInt; TestBase()
{
m_nInt = 0;
} ~TestBase()
{
TRACE( "TestBase Destructor.\r\n" );
} void SetData()
{
m_nInt = 1;
}};
class Test : public TestBase
{
private:
protected:
public:
Test()
{
} ~Test()
{
TRACE( "Test Destructor.\r\n");
} Test& assign( const Test &source )
{
if ( this != &source )
{
this->~Test();
new Test( source );
}
return *this;
}
};int DoTest()
{
int nReturn = 0;
Test TestA;
Test TestB; TRACE1( "TestA, m_nInt:%d\r\n", TestA.m_nInt );
TRACE1( "TestB, m_nInt:%d\r\n", TestB.m_nInt ); TestB.SetData(); TRACE1( "TestA, m_nInt:%d\r\n", TestA.m_nInt );
TRACE1( "TestB, m_nInt:%d\r\n", TestB.m_nInt ); TestA.assign( TestB );
TRACE1( "TestA, m_nInt:%d\r\n", TestA.m_nInt );
TRACE1( "TestB, m_nInt:%d\r\n", TestB.m_nInt );
return nReturn;
}return nReturn; 之前的输出是TestA, m_nInt:0
TestB, m_nInt:0
TestA, m_nInt:0
TestB, m_nInt:1
Test Destructor.
TestBase Destructor.
TestA, m_nInt:0
TestB, m_nInt:1
assign的功能就是释放资源,再执行一次构造函数?还是和编译器有关?
Type *p = new Type,这句里没有任何函数调用的语法格式,凭什么调用了函数Type::Type()?delete p也同样没有任何函数调用的语法格式,凭什么调用了函数Type::~Type()?从语法上来讲,这完全毫无道理。但如果这样写:
Type *p = malloc(sizeof(Type)); // 分配内存
new (p) Type(); // 调用函数Type()
p->~Type(); // 调用函数~Type()
free(p); // 释放内存
事情就非常清楚了。至此,谁更“本质”,不是很清楚吗?说起谁更“本质”,顺便还可以看一个例子:a = b + c,大家看着很舒服,不过,这句话的真正含义,却是一个看起来不那么舒服的东西:operator=(a, operator+(b, c));觉得后面这个别扭?那你又如何理解你所重载出来的operator=和operator+?虽然,没有必要的时候,谁都会写a=b+c,不过,弄清楚a=b+c背后的含义、或者说a=b+c到底是什么东西的简写,对于一个C++程序员来说,确是非常必要的。
this->~classType();
new (this) classType( source ); //这一句,应该很容易迷惑人。实际和下面的代码是等价的。远没有下面的代码清晰。this->~classType();
classType();
const classType &source 不知是否和编译器有关,否则的话,这段代码的作者也太大神了。
所以你才不明白const classType &source这个参数的作用。如果没有这个参数,这个函数就只能叫Clear了,怎么能叫assign?
new Test( source ); // 改成 Test();看看有没有效果。反正我的vs2010,是绝对有效的。理论是要能通过验证的。
class A
{
public:
int i; A() { i = 0; }
A(const A& a) { i = a.i; }
virtual ~A() { i = -1; } void assign(const A& a);
};void A::assign(const A& a)
{
this->~A();
// A(); // 你的代码
// new (this) A(a); // 我的代码
}void main()
{
A a, b; b.i = 2;
a.assign(b);
printf("%d", a.i);
}
没有new。
不需要delete吧。
假如调用assign的是对象指针或是引用,用this = new classType(source) 也没关系
但如果仅仅是一个对象,那用this = new classType( source ) 会导致严重的错误。
不想再说下去了,浪费时间。
class A
{
public:
int i; A() { i = 0; }
A(const A& a) { i = a.i; }
virtual ~A() { i = -1; } void assign(const A& a);
};void A::assign(const A& a)
{
this->~A();
// A(); // 你的代码
new (this) A(a); // 我的代码
}void main()
{
A a, b; b.i = 2;
a.assign(b);
printf("%d", a.i);
}你根本都没编译运行过。
我确认,我是正确的,不知别的编译器是怎样的,但是, vs2010 能证明我是正确的。
如果你确认你是正确的,那么贴出你的代码和运行结果!
使用 new (this) A(a): 在VS2010中出现“error C2660: “operator new”: 函数不接受 2 个参数”
在GCC中出现“
<internal>: In member function `void A::assign(const A&)':
<internal>:23: error: too many arguments to function `void* operator
new(unsigned int)'
testNew.cpp:23: error: at this point in file”请问怎样能编辑通过?是不是那里写错了?
解决问题了,xxd_qd的程序没有问题,结果与他说的一样,学习了