首页 > 编程语言 >C++ —— 构造函数和析构函数

C++ —— 构造函数和析构函数

时间:2025-01-10 18:31:03浏览次数:3  
标签:函数 Car brand cout C++ 析构 和析构 构造函数

C++ —— 构造函数和析构函数

引言

构造函数析构函数classC++struct专属的功能(Cstruct没有),用于管理对象的生命周期。
构造函数:在创建对象时,自动的进行初始化工作。
析构函数:在销毁对象前,自动的完成清理工作。

构造函数

  • 访问权限必须是public
  • 函数名必须与类名相同
  • 没有返回值,void
  • 可以有参数,可以重载,可以有默认参数
  • 创建对象时只会自动调用一次不能手工调用。

示例代码如下:

#include <iostream>
using namespace std;

class Car {
public:
    string brand;
    float acceleration;
    
    Car() {cout << "Car constructor. ~ 1 ~" << endl;} // 无参构造
    Car(string b) { // 一个参数的构造函数
        brand = b;
        cout << brand << " brand Car, constructor.~ 2 ~" << endl;
    }
    Car(string b, float a) { // 两个参数的构造函数
        brand = b;
        acceleration = a;
        cout << brand << " brand Car, constructor.~ 3 ~" << endl;
        cout << "Acceleration: " << acceleration << ".~ 3 ~" << endl;
    }
};

int main() {
    Car car1;
    Car car2("Tesla");
    Car car3("Porsche", 10.0);

    return 0;
}

运行效果如下:

Car constructor. ~ 1 ~
Tesla brand Car, constructor.~ 2 ~
Porsche brand Car, constructor.~ 3 ~
Acceleration: 10.~ 3 ~

析构函数

  • 访问权限必须是public
  • 函数名必须在类名前~
  • 没有返回值,也void
  • 没有参数,不能重载;
  • 销毁对象前只会自动调用一次,但是可以手工调用。

在原class的定义中加入代码:~Car() {cout << "Car destructor." << endl;} // 析构函数即可。整体代码如下:

#include <iostream>
using namespace std;

class Car {
public:
    string brand;
    float acceleration;
    
    Car() {cout << "Car constructor. ~ 1 ~" << endl;} // 无参构造
    Car(string b) { // 一个参数的构造函数
        brand = b;
        cout << brand << " brand Car, constructor.~ 2 ~" << endl;
    }
    Car(string b, float a) { // 两个参数的构造函数
        brand = b;
        acceleration = a;
        cout << brand << " brand Car, constructor.~ 3 ~" << endl;
        cout << "Acceleration: " << acceleration << ".~ 3 ~" << endl;
    }

    ~Car() {cout << "Car destructor." << endl;} // 析构函数
};

int main() {
    Car car("Porsche", 3.6);

    return 0;
}

运行结果如下:

Porsche brand Car, constructor.~ 3 ~
Acceleration: 3.6.~ 3 ~
Car destructor.

注意事项

  • 如果没有提供构造/析构函数,编译器提供空实现的构造/析构函数;
  • 如果提供了构造/析构函数,编译器不提供空实现的构造/析构函数;
  • 创建对象的时候,如果重载了构造函数,编译器根据实参匹配相应的构造函数。没有参数的构造函数也叫默认构造函数
  • 创建对象的时候不要在对象名后面加空的圆括号,编译器误认为是声明函数。(没有构造函数、构造函数没有参数、构造函数的参数都有默认参数)
  • 构造函数名后面加括号参数不是调用构造函数,是创建匿名对象
  • 以下两种方法有本质的区别:
Car car1; // 创建对象
car1 = Car("Tesla_1"); // 创建匿名对象,然后给现有的对象赋值。
// 上面这种方法会调用两次构造和析构
// 下面这种方法会调用一次构造和析构
Car car2 = Car("Tesla_2"); // 显式创建对象
  • 不建议在构造/析构函数中写太多的代码,可以调用成员函数;
  • 除了初始化,不建议让构造函数做太多工作(只能成功不会失败)。
  • 如果类的成员也是创建对象的时候,构造成员类销毁对象的时候,析构成员类

感谢浏览,一起学习!

标签:函数,Car,brand,cout,C++,析构,和析构,构造函数
From: https://blog.csdn.net/MaoSiri/article/details/145036925

相关文章

  • C++:爬楼梯问题,设有阶台阶需要攀登,每次只能上1阶或2阶,问共有多少种上台阶方案。程序输
    代码如下:#include<iostream>usingnamespacestd;intlou(intx){ if(x==1||x==2) returnx; else returnlou(x-1)+lou(x-2);}intmain(){ intn; cout<<"请输入台阶数:"; cin>>n; cout<<"上台阶方案总数为&quo......
  • 基于弦截法求解多项式函数根的 C++ 程序及其多领域延伸应用
    一、头文件部分#include<iostream>#include<cmath>#include<vector>#include<algorithm>#include<opencv2\opencv.hpp>#include<Eigen/Dense>#include<iostream>#include<complex>#include<unsupported/Eigen/Pol......
  • C++项目Visual Studio 如何在Release编译模式下断点调试
    在VS中,Debug编译模式下通常是默认支持断点调试的,但有时项目需要会需要在Release编译模式下进行打断点调试原因无外乎三点:Debug模式下编译运行无异常,但Release下出现问题需要release下屏蔽断言和部分宏定义win平台的动态库区分release和debug模式,部分项目......
  • 【C++】C++11(二)
    目录九、可变参数模板十、lambda表达式10.1C++98中的一个例子10.2lambda表达式10.3lambda表达式语法10.3.1lambda表达式各部分说明10.3.2捕获列表说明10.4函数对象与lambda表达式十一、包装器11.1function包装器11.2bind十二、线程库12.1线程12.1.1thread......
  • 通过循环展开减少循环控制的开销 c++实现
    循环展开是一种优化技术,通过减少循环控制的开销来提高程序性能。在C++中,可以通过手动展开循环来实现这一点。以下是如何在C++中实现循环展开的示例。示例:向量加法的循环展开我们将创建一个简单的向量加法示例,展示如何通过循环展开来提高性能。1.基本向量加法首先实现一个......
  • C++ 中使用预取指令可以帮助减少缓存未命中的延迟
    在C++中使用预取指令可以帮助减少缓存未命中的延迟,从而提高程序性能。以下是如何在代码中实现预取的详细步骤和示例。1.理解预取指令预取指令允许CPU提前加载数据到缓存中,从而在需要时可以更快地访问。这在处理大量数据时特别有用。例如,SSE2提供了_mm_prefetch指令。2.......
  • 在c++代码怎么实现数据对齐
    在C++中实现数据对齐可以通过以下几种方法:1.使用alignas关键字C++11引入了alignas关键字,可以用来控制变量的对齐方式。#include<iostream>#include<emmintrin.h>//SSE2alignas(16)floata[4]={1.0f,2.0f,3.0f,4.0f};alignas(16)floatb[4]={5.0f,6.0......
  • C++ 文件操作入门到实践:轻松搞定逐行读取,助力期末作业与毕业设计!
    ......
  • C/C++序列重构问题
    问题描述采儿是一位负责一班......
  • 【c++实战项目】负载均衡式在线OJ
    主页:醋溜马桶圈-CSDN博客专栏:实战项目_醋溜马桶圈的博客-CSDN博客gitee:mnxcc(mnxcc)-Gitee.com项目源码文件版:OnlineJudge_file:负载均衡在线OJ项目基于文件版本数据库版:mnxcc/OnlineJudge_MySQL目录1.项目目标2.技术与开发环境2.1技术2.2开发环境3.项目宏观......