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个。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)