首页 > 编程语言 >C++构造函数、析构函数、初始化列表

C++构造函数、析构函数、初始化列表

时间:2023-08-24 11:23:14浏览次数:34  
标签:初始化 函数 C++ 析构 public 类名 构造函数

构造函数

构造函数就是与类名同名的成员函数,当实例化对象时它会自动执行,当构造函数执行结束后,对象才完成实例化

任务:一般负责对类对象进行初始化、资源分配

class 类名
    {
        int* p;
    public:
        类名(参数)
        {
            p = new int;
        }
    };

1、构造函数必须是public,否则无法实例化对象

2、构造函数可以重载,可以有多个版本的构造函数(无参、有参)

3、带参数的构造函数的调用

类名 对象名(实参);   //  使用实参调用有参构造

类名* 对象名 = new 类名(实参);  //  使用实参调用有参构造

4、默认情况下编译器会自动生成一个什么都不干的无参构造函数,但一旦显式地实现了构造函数,就不再自动生成该无参构造函数了

5、如果给有参构造设置了默认形参,实例化对象时可以出现类似调用无参构造的语句,但实际是调用有参构造

6、构造函数没有返回值

7、不能使用malloc给类对象分配内存,因为它不会调用构造函数

析构函数

任务:析构函数一般负责对类对象内容进行收尾工作,例如:释放资源、保存数据等

当对象销毁时会自动执行

class 类名
    {
        int* p;
    public:
        类名    (参数)    //有参构造    
        {
            p = new int;
        }
        ~类名(void)    //析构函数
        {
            delete p;
        }
    };

1、析构函数也必须是public

2、析构函数没有参数、没有返回值、不能重载

3、当类对象生命周期完结,被操作系统自动释放(栈),或者通过delete手动释放(堆) 才会调用析构函数

#include <iostream>
using namespace std;

class Test
{
public:
   /*
    Test(void)
    {
        cout << "我是Test的无参构造" << endl;
    }
    */
    Test(int num = 88)
    {
        cout << "我是Test的有参构造 " << num << endl;    
    }
    ~Test(void)
    {
        cout << "我是Test的析构函数" << endl;    
    }
};

int main(int argc,const char* argv[])
{
    Test t;    //栈内存,程序结束自动释放,因此也会调用析构
    //    Test t(44);
    Test* t1 = new Test(77);
    delete t1;    //调用了析构
}

4、构造函数必定执行,但析构函数不一定会执行

5、不能使用free销毁类对象,因为不会调用析构函数

6、如果没有显式地实现析构函数,编译器也会自动生成一个什么都不做的析构函数

初始化列表

初始化列表是属于构造函数的一种特殊语法,只能在构造函数中使用

class 类名
    {
        const 成员1;
        成员2;
    public:
        类名(参数) : 成员1(val),成员2(val) // 初始化语句 val可以是常量、变量
        {
            //成员1 = val; 属于赋值语句 不是初始化 带const属性的成员就无法赋值
        }
    };

注意:

1、初始化列表是先于构造函数执行初始化列表执行时类对象还没有实例化完成,因此它是一种给const属性成员变量初始化的最佳方案

2、当参数名与成员名相同时,初始化列表可以分辨出来,可以同名

3、当成员中有类类型,该成员的有参构造函数可以在初始化列表中调用

#include <iostream>
using namespace std;

class Test
{
public:
	Test(int num)
	{
		cout << "Test的有参构造" << endl;	
	}
};

class Data
{
	const int num;
	Test t;
public:
	Data(int num):num(num),t(10)
	{
	//	num = _num;	
		cout << "Data的有参构造" << endl;
	}
	void show()
	{
		cout <<  num << endl;	
	}
};

int main(int argc,const char* argv[])
{
	Data d(88);    //先调用Test的有参构造,再调用Data的有参构造
	d.show();
}

标签:初始化,函数,C++,析构,public,类名,构造函数
From: https://www.cnblogs.com/ljf-0804/p/17653714.html

相关文章

  • C++内联函数、引用、强制类型转换
    三、内联函数inline1、普通函数普通函数会被编译成二进制指令存储在代码段中,调用语句会生成一条跳转指令,当程序运行到调用语句时,会跳转该函数在代码段中对应的位置执行,执行结束会返回2、什么是内联函数内联函数也会被翻译成二进制指令,但调用语句不会生成跳转指令,而是直接把内......
  • 在Windows系统中搭建C++刷算法题环境
    下载Docker首先,到Docker官方网站下载适合Windows系统的DockerDesktop并安装。下载Ubuntu镜像使用如下命令安装Ubuntu最新镜像:dockerpullubuntu在镜像中搭建C++编译环境使用如下命令启动一个ubuntu容器:dockerrun-itd--nameubt-cpp-v/d/code/algo:/dataubuntu使......
  • C++虚函数、虚继承:virtual
    ​1.引子在类的继承当中曾经出现过这样一种情况:B、C继承自A,D继承自B和C。 之前提到过,这种情况下,关于类A当中的内容,会被复制成两份给到D,当进行访问的时候,需要指定C或者B,才能够定位到A当中的变量是来自哪里。就像下面这样。​ 代码表示:classA{public:A(int......
  • C++类与对象(二)
    一、类的默认成员函数类内的默认成员函数:用户不显示实现,编译器就会自动生成的成员函数,被称为类的默认成员函数。这些默认成员函数各有各存在的作用。但实际上,很多时候,需要自己写这些成员函数,而不是使用编译器生成的。翻译一下就是,在类内有这样六个成员函数,如果你不写,编译器就会自动......
  • C++笔记
    C++笔记将数字以十六进制输出:cout<<hex<<100<<endl;将数字以八进制输出:cout<<oct<<100<<endl;精度控制include保存a位小数:setprecision(a)将b保留a位:cout<<setprecision(a)<<b<<endl将b保留小数点后a位:cout<<setiosflags(ios::fixed)<<se......
  • C++面向对象笔记(转载自黑马程序员)
    C++核心编程本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓。1内存分区模型C++程序在执行时,将内存大方向划分为4个区域代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的......
  • 类和对象(c++对象模型和this指针)
    1.成员变量和成员函数分开储存只有非静态成员变量才属于类的对象上。空对象内存占用空间为1this指针的概念this指针指向被调用的成员函数所属的对象this指针式隐含每个非静态成员函数内的一种指针。this指针不需要定义,直接使用即可。this指针的用途:1.当形参和成员变量同名时,可用thi......
  • 标准C++ -- day03
    一、对象的创建和销毁过程分析对象的创建过程给对象划分内存空间执行初始化列表根据继承表的顺序调用父类的无参构造或者有参构造通过:父类名(val)调用父类的有参构造根据成员变量的定义顺序调用类类型成员的无参构造或者有参构造通过:类类型成员名(val)调用类......
  • Qt/C++开发经验小技巧281-285
    悬停窗体QDockWidget默认在标题栏右键会弹出悬停模块的显示隐藏菜单,如果需要去掉,会发现设置Qt::NoContextMenu或者事件过滤器拦截都是无效的,必须设置dockWidget->setContextMenuPolicy(Qt::PreventContextMenu);。Qt中的布局有个默认的margin边距值和spacing间距值,在没有设......
  • Pybind11:使用C++编写Python模块
    放假摆了一周了。看论文实在不是什么有意思的活。这两天研究了一下Pybind11的用法。使用C/C++和Python混合编程的想法很早就有了,在大一的一次比赛时曾经实践过(虽然不是我写的),当时获得了比较显著的性能提升。但是当时用的是Swig,据队友说Swig对于NumPy的支持极为阴间,当时调试花了好......