请教高人:在构造函数中使用this指针危险吗?

时间:2021-01-14 20:41:56

我的一个程序在构造函数中使用了this指针,编译器抱警告。虽然运行了一段时间并未发生错误,但心中总是不安。希望有高人指点。
代码大概像这样:

class MyClass
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};

16 个解决方案

#1


您为什么要设计一个MyClass *呢?

#2


在对象没有被完全被构造出来出前,最好不要用this指针。因此只有构造函数执行完后,对象才是完整的。这个代码逻辑上是错的,

#3


因为是在构造函数的初始化列表中,
此时this对象还没有完全形成,所以会有警告。
不过如果只是看上面的代码是没有问题的。

#4


你这叫什么你懂吗
这叫多此一举
它系统本身就默认了一个this指针
你干吗还要再搞一个`

#5


to:vcchunhong(願意偽祢) 
它只不过是初始化成this,可能在程序中还要付给别的MyClass指针。

构造函数中使用this,在理论上是容许的。虽然this还没有构造好,

但此时编译器会默认构造此对象。

#6


class MyClass
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};
对象没有被完全被构造出来出前,最好不要用this指针。因此只有构造函数执行完后,对象才是完整的。这个代码逻辑上是错的,
之所以运行的正确的,是因为你的每个对象实体都创建成功了!
我想你是在实现链表的时候这样做的!

#7


找到篇文章,希望有帮助。
http://hqtech.nease.net/articles/VC_ConstructorThis.htm

#8


应该说this指向的地址是正确的,但是有可能无法正确访问它的成员

#9


同意julyclyde的说法

#10


谢谢 willcheng() (^^) 信誉的文章(愿你早日升星)。
我觉得应该把我的问题更具体一些会。我想实现一个这样的功能:默认情况下MyClass *_pMyClass指向自身,但在以后可能会设置为指向其他的MyClass。起初我想将_pMyClass
初始为0,这样需要一步判断。

希望高人们谈谈你们的想法。

#11


你把初始化放在函数体中看会不会有警告。应该不会有问题。

#12


....
起初我想将_pMyClass
初始为0,这样需要一步判断。
....

指向自身的时候你也用不到它阿,不如你的判断语句都改为
_pMyClass != this
这种形式

#13


class MyClass
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};

上面的代码好像不太好吧,改成:
class MyClass
{
public:
MyClass():{_pMyClass = this;}
private:
MyClass *_pMyClass;
};
在构造函数中,使用this指针应当有限制:就是不要访问this对象的函数和变量(包括所有被调用函数内部也不要访问this对象的函数和变量),仅仅作为一个地址来传递和赋值是安全的。

#14


不错~

#15


class MyClass
{
public:
MyClass(){
_pMyClass = this;
}
private:
MyClass *_pMyClass;
};
就没有问题了,
MyClass():_pMyClass(this){}不好是因为用到了缺省的拷贝构造函数,也许有风险,因此警告。

#16


类中的数据地址是在编译时就已经具有的了,也就是偏移量,下面举个例子,下面的例子都是假设在构造函数中执行的。
正确例子:
MyClass *p = new MyClass();
错误例子:
MyClass *p = new MyClassExtended();  // 假设MyClassExtended是MyClass的子类,这时属于MyClassExtended的数据还没有准备好,因为构造函数是从基类开始构造的,此时访问MyClassExtended扩展的数据就是错误的。

#1


您为什么要设计一个MyClass *呢?

#2


在对象没有被完全被构造出来出前,最好不要用this指针。因此只有构造函数执行完后,对象才是完整的。这个代码逻辑上是错的,

#3


因为是在构造函数的初始化列表中,
此时this对象还没有完全形成,所以会有警告。
不过如果只是看上面的代码是没有问题的。

#4


你这叫什么你懂吗
这叫多此一举
它系统本身就默认了一个this指针
你干吗还要再搞一个`

#5


to:vcchunhong(願意偽祢) 
它只不过是初始化成this,可能在程序中还要付给别的MyClass指针。

构造函数中使用this,在理论上是容许的。虽然this还没有构造好,

但此时编译器会默认构造此对象。

#6


class MyClass
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};
对象没有被完全被构造出来出前,最好不要用this指针。因此只有构造函数执行完后,对象才是完整的。这个代码逻辑上是错的,
之所以运行的正确的,是因为你的每个对象实体都创建成功了!
我想你是在实现链表的时候这样做的!

#7


找到篇文章,希望有帮助。
http://hqtech.nease.net/articles/VC_ConstructorThis.htm

#8


应该说this指向的地址是正确的,但是有可能无法正确访问它的成员

#9


同意julyclyde的说法

#10


谢谢 willcheng() (^^) 信誉的文章(愿你早日升星)。
我觉得应该把我的问题更具体一些会。我想实现一个这样的功能:默认情况下MyClass *_pMyClass指向自身,但在以后可能会设置为指向其他的MyClass。起初我想将_pMyClass
初始为0,这样需要一步判断。

希望高人们谈谈你们的想法。

#11


你把初始化放在函数体中看会不会有警告。应该不会有问题。

#12


....
起初我想将_pMyClass
初始为0,这样需要一步判断。
....

指向自身的时候你也用不到它阿,不如你的判断语句都改为
_pMyClass != this
这种形式

#13


class MyClass
{
public:
MyClass():_pMyClass(this){}
private:
MyClass *_pMyClass;
};

上面的代码好像不太好吧,改成:
class MyClass
{
public:
MyClass():{_pMyClass = this;}
private:
MyClass *_pMyClass;
};
在构造函数中,使用this指针应当有限制:就是不要访问this对象的函数和变量(包括所有被调用函数内部也不要访问this对象的函数和变量),仅仅作为一个地址来传递和赋值是安全的。

#14


不错~

#15


class MyClass
{
public:
MyClass(){
_pMyClass = this;
}
private:
MyClass *_pMyClass;
};
就没有问题了,
MyClass():_pMyClass(this){}不好是因为用到了缺省的拷贝构造函数,也许有风险,因此警告。

#16


类中的数据地址是在编译时就已经具有的了,也就是偏移量,下面举个例子,下面的例子都是假设在构造函数中执行的。
正确例子:
MyClass *p = new MyClass();
错误例子:
MyClass *p = new MyClassExtended();  // 假设MyClassExtended是MyClass的子类,这时属于MyClassExtended的数据还没有准备好,因为构造函数是从基类开始构造的,此时访问MyClassExtended扩展的数据就是错误的。