首页 > 编程语言 >C++类开发第二篇(浅析构造函数和析构函数)

C++类开发第二篇(浅析构造函数和析构函数)

时间:2024-02-06 23:34:13浏览次数:32  
标签:初始化 regina 函数 对象 C++ 构造函数 浅析 Stock

class_2

构造函数

构造函数是一种特殊的成员函数,用于创建和初始化类的对象。它的名称与类的名称相同,没有返回值,也不需要显式调用。在C++中,每个类都必须至少有一个构造函数。

当我们创建一个类的对象时,编译器会自动调用构造函数来初始化该对象的成员变量。构造函数可以执行一些操作,如初始化成员变量、申请资源、打开文件等。上一篇当中提到的Stock类,如果直接运行

	Stock regina;
	//regina.acquire("ivanlee", 20, 12.5);
	//regina.show();
	regina.buy(20, 12.7);
	regina.show();

image-20240206100651561

股票份额由于没有初始化则会赋予一堆乱码。定义好构造函数的话在初始化regina实例的时候就会帮助我们设置一些数据。

首先在声明类的地方写好这一函数(必须放在public里面

class Stock {	
private:
	...
public:

	Stock(const string& co = "default_regina", long n = 0, double pr = 0.0);
};

由于我们在后续的代码里要对一些数据进行初始化,所以要给每一个参数默认值,不然会引发C++ 类 不存在默认构造函数的错误。

然后再去对构造函数进行编写

Stock::Stock(const string& co, long n, double pr) {
	company = co;
	if (n <= 0) {
		shares = 0;
		cout << "number of shares can not be negative; "
			<< company << " shares set to 0 \n";
	}
	else { shares = n; }
	share_val = pr;
	set_total();

}

再直接运行前面的代码的话,就会给一些合法的初始值。image-20240206104359858

执行顺序

任何构造函数都是在定义好某一个对象的时候就会运行的,不管其他方法是否会调用。

image-20240206105125996

构造函数的分类及调用

按参数类型:分为无参构造函数和有参构造函数

按类型分类:普通构造函数和拷贝构造函数(复制构造函数)

  • 普通构造函数是用来初始化新创建的对象的函数。它没有参数或者有若干个参数,用来指定如何初始化对象的各个成员变量。
  • 当我们创建一个类的对象时,会自动调用该类的普通构造函数来完成对象的初始化工作。
  • 拷贝构造函数是一种特殊的构造函数,它接受同类型的对象作为参数,并根据给定的对象创建一个新的对象。
  • 拷贝构造函数通常在对象复制、传递和返回值传递时被隐式调用。
#include<iostream>
using namespace std;
class Regina {

private:
	int mAge;

public:
	Regina() {
		cout << "无参数构造函数" << endl;
		mAge = 0;
	}
	Regina(int age) {
		cout << "有参数构造函数" << endl;
		mAge = age;
	}
	//拷贝构造函数(复制构造函数) 使用另一个对象初始化本对象
	Regina(Regina& regina) {
		cout << "拷贝构造函数" << endl;
		mAge = regina.mAge;
	}
	void Print() {
		cout << mAge << endl;
	}
};
//1. 无参构造调用方式
void no_params_test(){
	cout << "无参构造调用方式" << endl;
	Regina regina;
	regina.Print();
}
void with_params_test() {
	//第一种 括号法,最常用
	cout << "括号法,最常用:" << endl;
	Regina regina(127);
	regina.Print();
	//调用拷贝构造函数
	cout << "调用拷贝构造函数:" << endl;
	Regina regina2(regina);
	regina2.Print();
	
	//第二种 匿名对象(显示调用构造函数)
	cout << "匿名对象(显示调用构造函数)" << endl;
	Regina(200); //匿名对象,没有名字的对象
}
int main() {
	no_params_test();
	with_params_test();
	return 0;

构造函数调用规则

默认情况下,c++编译器至少为我们写的类增加3个函数

1.默认构造函数(无参,函数体为空)

2.默认析构函数(无参,函数体为空)

3.默认拷贝构造函数,对类中非静态成员属性简单值拷贝

如果用户定义拷贝构造函数,c++不会再提供任何默认构造函数

如果用户定义了普通构造(非拷贝),c++不在提供默认无参构造,但是会提供默认拷贝构造

析构函数

析构函数是在对象生命周期结束时被调用的特殊成员函数,其作用是用于释放对象所占用的资源。通常情况下,析构函数用于执行一些清理工作,例如释放动态分配的内存、关闭文件、释放资源等操作,以确保对象在销毁时不会导致资源泄漏。

在C++中,析构函数的名称与类名相同,前面加上波浪号"~"。它没有返回值,也不接受任何参数。当对象超出作用域、delete被用于释放对象的动态内存分配时,或程序结束时,析构函数将会被自动调用。

Stock::~Stock() {
	cout << "Bye, " << company << endl;
}

image-20240206231553873

标签:初始化,regina,函数,对象,C++,构造函数,浅析,Stock
From: https://www.cnblogs.com/ivanlee717/p/18010466

相关文章

  • c++ function
    可调用对象函数函数指针函数类lamda表达式bind对象函数类重载了函数调用运算符()的类的对象,称为函数对象。classcallable{public:voidoperator()(intx)const{cout<<"callable::operator():"<<x<<endl;}};intmain(){calla......
  • C++编程练习||1.排序函数模板2.函数模板3.重载printArray函数模板
    1.排序函数模板已知主函数如程序后缀代码所示,请为其编写适当的模板函数,使主函数的bubbleSort函数可以对一个整型数组和一个浮点数数组进行输入、排序、输出操作。#include<iostream>#include<iomanip>usingnamespacestd;template<typenameT>voidbubbleSort(T*arr,......
  • c++命名空间
    1.命名空间定义注:命名空间只能在全局变量中定义namespacemystd{intx,y;intmax(inta,intb){returnstd::max(a,b);}}intmain(){inta=10,b=4;std::cout<<mystd::max(a,b);}2.命名空间可以嵌套namespacemystd{......
  • DevC++ 支持c++11
    DevC++支持c11报错解决点击工具,选择编译选项勾选编译时加入一下命令-std=c++11......
  • C++(learning)
     模板宏例子,用于创建get()、set()#defineWELD_ATTACH_INFO_SETGET(T,FUN,VAR)\inlineTget##FUN()const{returnVAR;}\inlinevoidset##FUN(Tt){VAR=t;}WELD_THRESHOLD_SETGET(int,InitId,init_id_) 方便引用#ifndefUSE_PLANDATA#defineUSE_PL......
  • Windows下如何使用 Sublime Text 4 配置 C/C++ 环境(使用LSP-clangd)
    1软件安装1.1SublimeText4安装及PackageControl安装略,请自行百度/必应/谷歌。1.2Clang环境安装1.2.1Clang下载在LLVMMinGW下载最新版Clang编译器,此处应根据个人电脑系统及版本选择,本文选择llvm-mingw-20231128-ucrt-x86_64.zip,后续文件名将以此为例。各版本......
  • C++编程练习||实现分数类Fraction1、实现分数的+,-,*,/ 2、逻辑运算==、!=、<、<=、>、>
    题目:实现分数类Fraction  classFraction{   intnumerator,denominator;   public:   ....  };  要求:1、实现分数的+,-,*,/2、逻辑运算==、!=、<、<=、>、>=6种运输符号。3、实现输出<<,输入 >>操作符重载。  样例1输入:   12 ......
  • 零基础入门Vue之影分身之术——列表渲染&渲染原理浅析
    听我说从条件渲染那一篇,我学习到了如何用Vue对dom节点根据条件显示但单单有条件还不够啊,有时候数据是一大坨一大坨的数据,如果Vue不提供咱要么使用“v-html”要么就没办法实现v-html又感觉太low了,Vue提供了另外的指令更好的实现,那便是:列表渲染列表渲染:v-for简单的列表渲染......
  • c++的类开发第一篇
    class_1什么是接口?类就是一种公共接口,公众(public)是使用类的程序,交互系统由类对象组成,而接口由编写类的人提供的方法组成。接口让程序员能够编写与类对象交互的代码,从而让程序能够使用类对象。例如,要计算string对象中包含多少个字符,您无需打开对象,而只需使用string类提供的s......
  • c++利用 STL解析ini 文件
    ini文件是InitializationFile的缩写,即初始化文件,通常存放的是一个程序的初始化信息,是Windows的系统配置文件所采用的存储格式,统管windows的各项配置。ini文件的后缀名不一定是.ini,也可以是.cfg、.conf或者是.tx*。ini文件是技术人员经常用到的一种系统配置方法,如何读取和快速识别......