C++运用new来初始化类的指针

1.ClassName * p = new ClassName;

调用默许结构函数。

C++使用new来初始化指向类的指针

如果类里没有写默许结构函数,会运用编译器帮咱们生成的,但不会初始化成员变量,如

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++使用new来初始化指向类的指针

C++指针初始化问题

c++中的指针是一个很经典的用法,可是也是最简单犯错的,比方界说了一个指针,必须对其进行初始化,否则这个指针指向的是一个不知道的内存地址,后续对其操作的时分,会报错。

这仅仅其次,最让人头疼的便是指针过错问题,往往编译的时分能够通过,在程序运行的时分,就会出现异常,如果对程序不是很熟悉,则不是很简单找到问题所在,我最近就遇到过许多这样的问题,界说了一个结构体指针,运用的时分忘掉初始化,导致在后边运用的时分程序报异常。

下面就总结一下c++指针初始化的一些方法,以及我自己遇到的一些问题以及心得体会。

C++使用new来初始化指向类的指针

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。

C++使用new来初始化指向类的指针

3.把指针设置为NULL或许0

这样做一般仅仅为了没有详细初始化的时分做的,这样避免了野指针,后边能够运用if(指针==NULL)来判别,然后再进行操作。

自己遇见的问题

我在运用结构体指针的时分,忘掉将结构体指针初始化,导致后边拜访结构体成员变量的时分出现过错(那种编译没错,履行犯错的问题),后来将指针运用new初始化处理,还有一点便是,大局的变量称号与局部变量称号不要相同。

C++使用new来初始化指向类的指针