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

 更新时间:2023年07月14日 08:57:03   作者:Fish`  
这篇文章主要介绍了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初始化解决,还有一点就是,全局的变量名称与局部变量名称不要一样。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用用C++做一颗会跳动的爱心实例代码

    使用用C++做一颗会跳动的爱心实例代码

    大家好,本篇文章主要讲的是使用用C++做一颗会跳动的爱心实例代码,感兴趣的同学赶快来看一看吧,欢迎借鉴学习C++做一颗会跳动的爱心实例代码
    2021-12-12
  • 使用C++制作简单的web服务器

    使用C++制作简单的web服务器

    本文给大家分享的是使用C++简单实现web服务器的代码,虽然非常的简陋,功能也很少,主要是为了更好的理解WEB服务器的工作原理,推荐给大家,也希望对大家能够有所帮助。
    2015-03-03
  • C++实现八皇后问题的方法

    C++实现八皇后问题的方法

    这篇文章主要介绍了C++实现八皇后问题的方法,是数据结构与算法中常见的一个经典算法,需要的朋友可以参考下
    2014-09-09
  • C/C++实现遍历文件夹最全方法总结

    C/C++实现遍历文件夹最全方法总结

    这篇文章主要为大家介绍了C/C++实现遍历文件夹功能的最全方法总结,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • C语言入门篇--充分理解操作符

    C语言入门篇--充分理解操作符

    本篇文章是基础篇,适合c语言刚入门的朋友,本文主要介绍了c语言的操作符基础理论,希望可以帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08
  • C++多线程std::call_once的使用

    C++多线程std::call_once的使用

    本文主要介绍了C++多线程std::call_once的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • c语言详解动态内存分配及常见错误的解决

    c语言详解动态内存分配及常见错误的解决

    给数组分配多大的内存空间?你是否和初学C时的我一样,有过这样的疑问。这一期就来聊一聊动态内存的分配,读完这篇文章,你可能对内存的分配有一个更好的理解
    2022-04-04
  • C++11中longlong超长整型和nullptr初始化空指针

    C++11中longlong超长整型和nullptr初始化空指针

    本文介绍 C++11 标准中新添加的 long long 超长整型和 nullptr 初始化空指针,在 C++11 标准下,相比 NULL 和 0,使用 nullptr 初始化空指针可以令我们编写的程序更加健壮,本文结合示例代码给大家详细讲解,需要的朋友跟随小编一起看看吧
    2022-12-12
  • C++浅析类与对象的基础

    C++浅析类与对象的基础

    类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型;变量就是可以变化的量,存储在内存中—个可以拥有在某个范围内的可变存储区域
    2022-05-05
  • C++详细讲解内存管理工具primitives

    C++详细讲解内存管理工具primitives

    文章向大家介绍C++内存管理primitives,主要包括primitives使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06

最新评论