C++ 类对象传参数和返回值的构造析构调用过程

C++拷贝构造函数—类临时对象的构建与析构 临时对象一般是调用拷贝构造函数来创建的,分为以下两种情况: ①对象作为实参初始化形参时(值传递) ②对象作为函数返回值(值传递) 阅读详情

1、 代码

#include<iostream>
using namespace std;
static int g_count = 1;
class test
{
public:
	//构造函数
	test(int p=10){ma = p ; cout<<g_count++<<"  test(int)"<<endl;}
	//析构函数
	~test(){cout<<g_count++<<"  ~test()"<<endl;}
	//拷贝构造函数
	test (const test &p)
	{
		ma = p.ma;
		cout<<g_count++<<"  operator(test)"<<endl;
	}
	//赋值运算符的重载
	test& operator=(const test p)
	{
		ma = p.ma;
		cout<<g_count++<<"  operator = (test)"<<endl;
		return *this;
	}
public:
	int getdata(){return ma;}
private:
	int ma;
};

test getobj(test t)
{
	int val = t.getdata();
	test tmp(val);
	return tmp;
}


int main()
{
	test t1;
	test t2;
	t2 = getobj(t1);

	return 0;
}

2、 分析

1、main函数里 test t1; 毋庸置疑直接调用构造函数;1、test(int)
2、main函数里 test t2; 毋庸置疑直接调用构造函数;2、test(int)
3、t2 = getobj(t1); 调用getobj 将实参t1传给形参t , 此时注意,实参到形参的过程是赋值还是初始化呢,答案是初始化,用一个存在的对象初始化一个新对象,那肯定是调用拷贝构造函数3、operator(test)
4、进入getobj , test tmp(val);生成临时对象,调用构造函数4、test(int)
5、return tmp; 返回数据,返回数据过程是这样的,在调用方的栈空间构造一个临时对象,有tmp拷贝构造完成,生成一个临时对象;5、operator(test)
6、此时已经出了getda()函数的作用域了,函数内的对象开始析构,先析构tmp ,6、~test() , 再析构形参7、~test()
7、t2 = getobj(t1); 用生成的临时对象给t2赋值,调用赋值运算符的重载; 8、 operator = (test)
8、赋值完毕后 , 第5步生成的临时对象开始析构;9、~test()
9、main函数执行完毕,开始析构,先析构t2 , 10、~test() 再析构t1 11、 ~test()

3、运行结果

在这里插入图片描述

C++为什么“没有调用”构造,但却调用了析构——其实调用了 C++忽略了默认复制构造函数造成的疑惑:为什么“没有调用”构造,但却调用了析构 提前说一下,不是没有调用,所有对象创建时,一定调用,但是某些情况下会调用系统生成的构造 先来看一段诡异的代码: class A { private: int a; public: A(int a = 0); ~A(); }; A::A(int a) { this->a =... 阅读详情

相关推荐

C++面向对象程序设计——8.构造和析构

如果一个带默认参数的构造函数和一个重载的构造函数在调用时无法区分,就会产生编译错误。这是机试和笔试中最常考的综合性问题,用来判断你是否真正理解了对象的整个生命周期。有时C++会自动把一个类型转换成你的类对象,这可能导致意想不到的行为。对于单参数的构造函数,除非你特意需要隐式转换,否则都应加上。这是一种方便的语法糖,可以在声明成员时就给出默认值。这是最常用的构造函数,允许在创建对象时传入初始值。关键字,这是一种良好的编程习惯。析构函数是另一个特殊的成员函数,在。构造函数是一个特殊的成员函数,在。

Rhett_Butler0922的博客 882

C++: 函数返回类对象时是否执行析构函数

#include<iostream> using namespace std; struct A { A(){} A(const A&) { cout<<"Copy constructor\n"; } ~A() { cout<<"Destructor\n"; } }; A f() { return A(); } A g() { A a; return .

qaqwqaqwq的博客 2051

LaTeX小白必看:TeX Live+TeXstudio保姆级安装教程(附清华镜像加速)

本文为LaTeX新手提供了一份详尽的TeX Live和TeXstudio安装指南。通过清华大学镜像站实现高速下载,并详细讲解了从下载、定制化安装到配置优化的每一步,帮助用户快速搭建稳定高效的本地LaTeX写作环境,轻松处理学术文档排版。

weixin_29214559的博客 412

C++学习之对象的构造和析构

C++学习之对象的构造和析构

qq_27302885的博客 1300

Java全栈AI视频生成开发实战:从DeepSeek接入到剪映自动化(附完整源码)

【代码】Java全栈AI视频生成开发实战:从DeepSeek接入到剪映自动化(附完整源码)

weixin_39169967的博客 4144

树莓派5安装ROS1避坑指南:从系统配置到cmake报错全解决

本文详细介绍了在树莓派5上安装ROS1的完整流程,包括系统配置、环境变量设置、cmake报错解决等关键步骤。针对树莓派5的ARM架构特性,提供了从基础安装到高级调试的系统级解决方案,帮助开发者高效部署ROS1并避免常见编译陷阱。特别针对cmake报错问题,给出了深度解析和实用修复方法。

spark7igniter的博客 233

C++的类与对象(三):构造和析构、缺省值、类对象的销毁顺序、拷贝构造(重要)

且成员变量的初始化顺序由它们在类中声明的顺序决定,而不是由构造函数初始化列表的顺序决定。

m0_73975164的博客 1328

高频注入是否需要对齐和强拖操作?

高频注入技术显著优化了传统FOC启动流程,但仍需部分对齐操作。传统启动必须包含位置检测、对齐和强拖等步骤,而高频注入可实现零速闭环,简化或跳过部分环节。高频注入下的对齐主要用于验证有效性、初始化观测器和建立初始磁链,形式可大幅简化。虽然高频注入基本消除了传统强拖需求,但在重载、弱凸极等特殊情况下仍需辅助。实际应用中可采用自适应混合策略,根据负载和电机类型选择最优启动方案。高频注入使对齐和强拖从"必须"变为"可选优化项",是无传感器控制的重要进步。

汽车软件开发 204

c++高级篇:构造、析构、 拷贝构造、赋值构造、移动构造、移动赋值构造等调用验证

本文验证主要针对有一定c++基础的同学,如果初学者需要自己补充下知识点,才能更好的理解本篇验证。

weixin_44834554的博客 1599

Java零基础之多线程篇:线程间如何通信?

随着计算机技术的发展,多线程编程已经成为现代软件开发中的一个重要方向。在多线程编程中,线程间的通信是一个非常关键的问题。在Java开发语言中,Java提供了一些机制来实现线程间的通信,帮助开发者协调不同线程之间的执行顺序和数据交换。本文将介绍Java多线程编程中的线程间通信的相关知识。首先,我们将从简介开始,介绍线程间通信的基本概念和原理。然后,我们将通过源代码解析的方式,深入探讨Java中实现线程间通信的方法。接着,我们将给出一些应用场景案例,展示线程间通信在实际开发中的应用。

喵手的博客 1557

Eclipse邂逅Deepseek:本地化部署全攻略

通过前面一系列的步骤,我们成功地在 Eclipse 中完成了 Deepseek 的本地化部署,并且对部署后的功能进行了测试和优化,还解决了可能遇到的一些常见问题。这一过程不仅让我们体验到了将强大的大语言模型与高效的开发环境相结合的魅力,也为我们在软件开发过程中带来了诸多便利。本地化部署 Deepseek 到 Eclipse,使得我们在代码编写过程中能够获得智能的代码补全和精准的问答支持,大大提高了开发效率。同时,本地化部署保障了数据的安全性和隐私性,避免了数据在传输过程中可能面临的风险。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4509

C++开发基础——类对象与构造析构

C++语法基础

程序员与背包客_CoderZ 2973

【深度学习新浪潮】为什么OpenClaw这么吃token?

OpenClaw 高 Token 消耗的核心是 Agent 多轮思考、工具调用上下文累积,以及平台内置的模板/多模型协同开销;PD 分离在 OpenClaw 中可针对性解决长上下文 Prefill 阻塞、KV Cache 复用低效问题,是提升其推理效率的核心优化手段,主要落地在长上下文处理与生成阶段解耦、KV Cache 集中管理、动态资源调度三个方向。

专注:太空算力、AI infra、异构调度、大模型成本工程 418

【C++】构造&析构

普通对象:构造顺序和析构顺序相反new出来的对象:delete会直接调用析构函数static对象:程序关闭时,生命周期才结束,所以是最后释放“重载篇”也提上日程了!

2301_76153977的博客 879

基于FPGA的多级CIC滤波器实现四倍插值

基于FPGA的多级CIC滤波器实现四倍插值 原文链接:基于FPGA的多级CIC滤波器实现四倍插值 在《基于FPGA的多级CIC滤波器实现四倍抽取一》和《基于FPGA的多级CIC滤波器实现四倍抽取二》中我们先来了解滑动平均滤波器、微分器、积分器以及梳状滤波器原理以及它们的幅频响应。此篇我们将用verilog实现基于FPGA的多级CIC滤波器实现四倍插值。 1 CIC滤波器的基本概述 CIC(积分梳状...

baidu_34971492的博客 3140

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++构造和析构

构造函数的名字跟它所在的类的名字一样,构造函数没有返回值(viod 也不用写),构造函数支持重载,就是根据传参来区分调用哪一个构造函数。内置类型是int/char/double/指针等类型,自定义类型是class/struct关键字创建的类型。构造函数是一个类的成员函数,在类创建好后(就是开劈好空间)自动调用构造函数对类的成员变量进行初始化。编译器自动生成的构造函数对内置类型有可能不做处理,对自定义类型会调用对应的构造函数。总结就是不传实参就调用的构造叫默认构造。在不传参时调用构造函数不用加括号。

2401_83305953的博客 1116

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Swift的构造和析构过程

构造过程 Swift的构造过程通过定义构造器来实现。 不过与Objective-C不同的是,Swift的构造器不需要返回值,同样也不需要表明Func。 另外值得提的是,当构造器中为存储型属性赋值时,不会触发属性观测器。 定制化的构造过程 1. 除了默认的构造器外,我们可以通过增加参数的方式来为其添加自定义的构造函数或者叫便捷构造器(covenience i

RannieR的技术博客 1909

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

秒懂C++之this指针、构造、析构

本篇文章全程高能,不仅讲解了this指针的隐藏面目还为大家详细讲解了构造函数与析构函数真正的实现内核,相信大家一定会有所收获的~

fax_player的博客 1128

C++类的构造与析构的一点细节问题

关于构造函数,复制构造,和析构的问题。 类的复制构造函数有两种调用的类型,一种是显示的调用 例如  class A = B, 另外一种是隐式的调用,例如传递形参,或者函数返回时。 今天发现自己对以类类型作为形参使用时的构造和析构认识不够,所以又找了找资料,写了个验证程序来熟悉了一下。          有三种情况下需要调用复制构造函数:         1) 一个对象以值传递的方式传入函

xiaoguaiyin的专栏 620

C++ 构造与析构

C++中的构造与析构、构造函数、析构函数、拷贝构造、explicit关键字、显示调用、隐式调用

good good study, day day up! 1228

C++中对象的构造与析构

本文将详细讲解C++中对象的构造和析构过程,包括构造函数、析构函数的作用及其调用时机,并通过实例分析,帮助读者更好地理解和使用C++对象的构造与析构。

2201_75782847的博客 898

C++中返回值为 类对象 详解

C++中返回值为 类对象 详解 代码如下: #include <iostream> using namespace std; //建一个Test类 class Test { public: Test() { a = 0; b = 0; cout << "无参构造函数被调用了" << endl; } Test(int aa, int bb) { a = aa; b = bb; cout << "有参构造函数被调用了" <&

abc 3458

C++ 一道题搞定C++构造析构的调用

#include using namespace std; class CSample { char ch1, ch2; public: friend void set(CSample & s, char c1, char c2); CSample(char a, char b) { ch1 = a; ch2 = b;

yfdyyy的专栏 710

C++类的构造与析构:对象生命周期的幕后操控者

在 C++ 的世界里,构造函数是一个特殊的成员函数,它的使命是在对象创建时被自动调用,为对象的初始化工作保驾护航。当你创建一个类的实例时,构造函数就如同一位幕后英雄,默默地为对象的各个数据成员赋予初始值,确保对象在诞生之初就处于一个合理的状态。

大雨淅淅的博客 1174

【C++基础】类和对象(重要知识点)封装;静态成员;构造和析构;this指针 ;友元friend;继承,多态

面向过程和面向对象的认识;封装;静态成员;构造和析构;this指针 ;友元friend;继承,多态

Catherine_77的博客 1102
上一篇: C++编译器对于类对象的优化四
下一篇: C++ map和unordermap的区别
越甲八千
博客等级 码龄11年 2953粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值