this指针和构造函数

this指针和构造函数,第1张

string::string(char

c[4])

{

cout<<"node

constructor

is

running"<<endl;

cdata=c;

prior=null;

next=null;

}

首先:参数是char[4];

"dfgh"已经溢出了。这个有5个字符包含结束符。

其次:你传进去只是简单的用指针指向这个数组的首地址。自身没有空间!

再次:

char

string::readc()

const

{

return

cdata;

}

这个函数返回的是char类型。肯定就只有'd'了哟!!

char

string::readc()

const

{

return

cdata;

}

改成返回指针就可以了!

防止拷贝构造和赋值构造时出问题。比如

class MyC{

……

private:

void p;

……

}

在如下情况:

MyC newc = oldc;//赋值

如果不自己写的话,系统会自动生成自己的拷贝构造函数,因为C++是值拷贝,所以就有:newcp = oldcp这时,两个对象的指针指向同一个对象(或者内存块)。如果在某个地方,删除了对象oldc,那么p所指向的内存块就不可访问了,这时再访问newcp就会访问一个被释放了的对象(内存块)。所以要手动为MyC写自己的拷贝和赋值构造函数,为p new一个新内存块,然后用newcp = oldcp(此处的“=”,是指内存块拷贝,具体 *** 作据p的类型而定)。

看了你的大概意思,理解上是可以的。

函数里的theAppm_pCurrentWinApp返回的是什么? 是theApp自己还是基类的对象?

它返回的就是theApp的,也就是派生类对象的地址。

其实派生类对象中就有基类部分。

那么基类构造函数里的this是基类的临时对象还是派生类的对象theApp,是派生类对象的地址指针this,不是基类的。调用基类的构造函数,就是对派生类继承基类的部分的数据进行赋值。

声明对象指针时不会调用构造函数,指针只是个特殊的变数而已。

对象声明可以有两种:

a 通过 类名 对象名;声明, 该声明后得到的对象已经隐式默认初始化了,分配了内存地址,并且已经存有了默认初始化后的类成员初始化值。例如 FirstStruct test; 之后就可以对FirstStruct的成员变量进行访问了: testagepush_back(15);

b 通过对象指针来声明,类名 对象指针名; 通过指针申明的对象没有初始化,只是分配了一个指针名,并没有进行初始化,即没有分配内存空间,所以需要用 new 进行初始化 *** 作。 FirstStruct ptest; test->push_back(30);是错误的, 必须在声明对象后,new初始化, 对象指针可以用 new初始化,也可以用其他同类对象的引用来初始化,参见c。FirstStruct ptest; ptest = new FirstStruct(); ptest->agepush_back(10);

c 也可以将同一个类对象的引用 赋给指针对象,例如: FirstStruct test; FirstStruct ptest = &test; 之后就可以通过指针ptest ->agepush_back(40); 直接对test对象的成员变量进行 *** 作了。

d 声明的指针的类型必须与所要指向对象/变量的地址内所存的类型一致。例如: bool pbool = &testagepush_back(15); 是错的,因为testage是int型 vector, 而bool型的指针不能指向一个int型vector变量的地址,bool pbool = &testsexual;则可以,pbool就指向了test对象的bool型成员变量sexual的地址了

构造函数有两处错误。修改成这样!

A(T a, FC pa = fun<T>) : b(a), p(pa){}

fun<T> 需要这样实例化模板

初始化参数列表前面是1个冒号,不是2个。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11669154.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存