写点什么

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

作者:向阳逐梦
  • 2023-08-13
    四川
  • 本文字数:1294 字

    阅读完需:约 4 分钟

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

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 初始化解决,还有一点就是,全局的变量名称与局部变量名称不要一样。


发布于: 刚刚阅读数: 4
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022-06-01 加入

某公司芯片测试工程师,嵌入式开发工程师,InfoQ签约作者,阿里云星级博主,华为云·云享专家。座右铭:向着太阳,追逐梦想!

评论

发布
暂无评论
C++使用new来初始化指向类的指针_向阳逐梦_InfoQ写作社区