C++运用new来初始化类的指针
1.ClassName * p = new ClassName;
调用默许结构函数。
如果类里没有写默许结构函数,会运用编译器帮咱们生成的,但不会初始化成员变量,如
class NoConstructor //没写结构函数的类
{
public:
~NoConstructor() {}
void printVal()
{
cout << m_val << endl;
}
private:
int m_val;
};
NoConstructor* p1 = new NoConstructor;
p1->printVal();`
打印出来的值是 -842150451,也便是未初始化。
2.ClassName * p = new ClassName();
调用默许结构函数。
如果类里没有写默许结构函数,会运用编译器帮咱们生成的,并且会初始化成员变量,比方 int 类会被初始化为 0
NoConstructor* p2 = new NoConstructor();
p2->printVal();`
此刻打印出来值是 0
3.ClassName * p = new ClassName(arg);
调用自界说结构函数,或含参数的默许结构函数(如果这两种函数都界说了,它们的arg类型必须不同,这是函数重载的要求)。
4.补充
关于几个概念:默许结构函数是指无参的结构函数,或有参数(即形参)、并且为所有形参指定了实参的结构函数。
非默许结构函数称为自界说结构函数。
如果在一个类里,两种默许结构函数都写了,那么new ClassName和new ClassName()都不可用。由于编译器无法确认要运用哪一个结构函数。
C++指针初始化问题
c++中的指针是一个很经典的用法,可是也是最简单犯错的,比方界说了一个指针,必须对其进行初始化,否则这个指针指向的是一个不知道的内存地址,后续对其操作的时分,会报错。
这仅仅其次,最让人头疼的便是指针过错问题,往往编译的时分能够通过,在程序运行的时分,就会出现异常,如果对程序不是很熟悉,则不是很简单找到问题所在,我最近就遇到过许多这样的问题,界说了一个结构体指针,运用的时分忘掉初始化,导致在后边运用的时分程序报异常。
下面就总结一下c++指针初始化的一些方法,以及我自己遇到的一些问题以及心得体会。
c++指针初始化的一般方法
1.将一个已经在内存中存在变量的地址传递给界说的指针
这个指针就指向这个变量的内存地址(相同的数据类型),完成初始化。
比方:
int a=2;
int *b=&a;
2.运用new开辟一块地址空间
struct test{
int a;
int b;
}*t;
void main()
{
int c=0;
test *t=new test();
c=t->a;
}
运用 new开辟的空间,记得运用delete开释,由于new出来的是返回的堆的空间,堆的空间是不会主动开释的,存放变量的栈才会主动开释。
delete开释其实仅仅开释了申请的这块内存空间,可是指针并没有没撤销,指针还是指向这块地址,可是不可用(靠人品吃饭的有或许能够用),是不合法的。所以用delete开释掉一块堆内存时,应该自己手动将指针设置为NULL。
3.把指针设置为NULL或许0
这样做一般仅仅为了没有详细初始化的时分做的,这样避免了野指针,后边能够运用if(指针==NULL)来判别,然后再进行操作。
自己遇见的问题
我在运用结构体指针的时分,忘掉将结构体指针初始化,导致后边拜访结构体成员变量的时分出现过错(那种编译没错,履行犯错的问题),后来将指针运用new初始化处理,还有一点便是,大局的变量称号与局部变量称号不要相同。