C++ 面向对象 - 对象定义方法汇总

C++对象定义方法汇总

1. 栈上定义方式

1.1 调用无参构造函数的定义方式

无参构造函数有两种:

  • 默认无参构造函数
    Demo(){}
    
  • 默认值列表构造函数
    Demo():a{1},b{2}{}	// 使用初始化列表实现
    

对象定义方式

Demo d;	
Demo d1{}; 
// 以下定义方式还调用了拷贝构造函数
Demo d2 = Demo();
Demo d3 = Demo{};

🚫 注意事项:

  • 一个类只能有一个无参构造函数:无参构造函数的参数列表都为空,无法实现函数重载。
  • 不能使用对象名()调用无参构造函数
  • 可以使用类名()的方式创建对象
  • 推荐使用花括号定义对象

示例

class Demo1{
public:// 无参构造函数Demo(){cout << "无参构造函数"}
}class Demo2{
private:int a;int b;
public:// 默认值列表构造函数Demo():a{1},b{2}{cout << "默认值列表构造函数"<< endl;}
}int main()
{// 栈变量Demo1 d1;	// 调用无参构造函数Demo2 d2{};  // 调用无参构造函数Demo1 d3 = Demo1();Demo2 d4 = Demo2{};// Demo2 d3(); // 错误
}
1.2 调用有参构造函数的定义方式

有参构造函数通过不同的参数列表进行重载。一个类中可以存在多个有参构造函数。
有参构造函数也可以使用参数默认值简化重载。包括兼并无参构造函数。

有参构造函数定义:

Demo(int a, int b):a(a),b(b){}

带默认值的有参构造函数定义:

Demo(int a = 1):a(a),b(1){}

此有参构造函数兼并无参构造函数,若定义了无参构造函数则会起冲突。

对象定义方式
调用有参构造函数的对象定义通过(){}来传递参数。
主流推荐使用{}

Demo d(2);	
Demo d1{2, 3}; 
// 以下定义方式还调用了拷贝构造函数
Demo d2 = Demo(2, 3);
Demo d3 = Demo{2};

示例

#include <iostream>
using namespace std;class Demo{
private:int a;int b;
public:// 带默认值的有参构造函数,可替代无参构造函数Demo(int a = 1):a{a},b{2}{cout << "带默认值的有参构造函数"<< endl;}// 初始化列表构造函数Demo(int a, int b):a{a},b{b}{cout << "初始化列表构造函数"<< endl;}
};int main()
{// 栈变量Demo d1;	// 有参构造函数Demo d2{3};	// 有参构造函数Demo d3{3, 4};  // 初始化列表构造函数Demo d4(3, 4);  // 初始化列表构造函数Demo d5 = Demo(2);	// 有参构造函数Demo d6 = Demo{2};	// 有参构造函数Demo d7 = Demo(2,6);	// 初始化列表构造函数Demo d8 = Demo{2,6};	// 初始化列表构造函数return 0;
}
1.3 调用拷贝构造函数的定义方式

拷贝构造函数是在用同类对象来定义新对象时调用。已经规定死了它的函数名和参数列表,所以不存在重载,一个类也只有一个拷贝构造函数。
拷贝构造函数定义:

Demo(const Demo& d):a{d.a},b{d.b}{}

对象定义方式
拷贝构造函数是一种有参构造函数,遵循有参构造函数的对象定义方式。也有一种独特的定义方式:=

Demo d1;	// 要先存在一个用来拷贝的对象
Demo d2(d1);
Demo d3{d1};
Demo d4 = d1;	// 对象定义时,= 号调用的是拷贝构造函数
Demo d4 = Demo();	// 通过临时对象来定义新对象

示例

#include <iostream>
using namespace std;class Demo{
private:int a;int b;
public:// 带默认值的有参构造函数,可替代无参构造函数Demo(int a = 1):a{a},b{2}{cout << "带默认值的有参构造函数"<< endl;}// 拷贝构造函数Demo(const Demo& d):a{d.a},b{d.b}{cout << "拷贝构造函数"<< endl;}
};int main()
{// 栈变量Demo d1;	// 有参构造函数// 拷贝构造函数Demo d11(d1);Demo d12{d1};Demo d13 = d1;Demo d2 = Demo(2);	// 有参构造函数Demo d3 = Demo{2};	// 有参构造函数return 0;
}

2. 堆上定义方式

堆上定义对象主要通过堆操作符new来实现,它返回一个对象指针。

1.1 调用无参构造函数的定义方式
Demo *pd = new Demo;		// 无参构造函数Demo *pd10 = new Demo[2];	// 无参构造函数,返回对象数组Demo *pd2 = new Demo();		// 无参构造函数Demo *pd3 = new Demo{};		// 无参构造函数
1.2 调用有参构造函数的定义方式
Demo *pd4 = new Demo(1);	// 有参构造函数
Demo *pd5 = new Demo{1};	// 有参构造函数
1.3 调用拷贝构造函数的定义方式
Demo d1;
Demo *pd1 = new Demo(d1);
Demo *pd2 = new Demo{d1};

3. 总结

对象定义方式有两大类:

  • 对象名类名 对象名;
  • 类名类名()
    对象定义的三小类:
  • 无参构造:可无符号、可带(){}。变量名不能带(),类名可以带()
  • 有参构造:可通过(){}传递参数。
  • 拷贝构造:由(){}=传递同类对象参数。

对象定义是指对象第一次创建,构造函数只会在对象第一次创建的时候调用,若是已有对象使用了与对象定义相似的格式,必定不会调用构造函数。

4. 综合示例

#include <iostream>
using namespace std;class Demo{
private:int a;int b;
public:// 无参构造函数
//	Demo(){cout << "无参构造函数"}// 默认值列表构造函数Demo():a{1},b{2}{cout << "无参构造函数"<< endl;}// 有参构造函数Demo(int a):a{a},b{2}{cout << "有参构造函数"<< endl;}// 初始化列表构造函数Demo(int a, int b):a{a},b{b}{cout << "初始化列表构造函数"<< endl;}// 拷贝构造函数Demo(const Demo& d):a{d.a},b{d.b}{cout << "拷贝构造函数"<< endl;}// 赋值运算符重载Demo& operator=(const Demo& d){cout << "赋值运算符重载"<< endl;if(this == &d) return *this;a = d.a;b = d.b;return *this;}
};int main()
{// 栈变量Demo d;	// 无参构造函数Demo d1{};  // 无参构造函数Demo d2{3};	// 有参构造函数Demo d3{3, 4};  // 初始化列表构造函数Demo d4(3, 4);  // 初始化列表构造函数Demo d5 = Demo();	// 无参构造函数Demo d6 = Demo{};	// 无参构造函数Demo d7 = Demo(2);	// 有参构造函数Demo d8 = Demo{2};	// 有参构造函数Demo d9 = Demo(2,6);	// 初始化列表构造函数Demo d10 = Demo{2,6};	// 初始化列表构造函数// 堆变量Demo *pd = new Demo;		// 无参构造函数Demo *pd10 = new Demo[2];Demo *pd2 = new Demo();		// 无参构造函数Demo *pd3 = new Demo{};		// 无参构造函数Demo *pd4 = new Demo(1);	// 有参构造函数Demo *pd5 = new Demo{1};	// 有参构造函数Demo *pd6 = new Demo(1, 2);	// 初始化列表构造函数Demo *pd7 = new Demo{1, 2};	// 初始化列表构造函数// 拷贝构造函数Demo d11(d4);Demo d12{d4};Demo d13 = d3;Demo *pd8 = new Demo(d4);Demo *pd9 = new Demo{d4};// 赋值运算符重载d11 = d3;*pd9 = d4;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90605.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

指尖上的魔法:优雅高效的Linux命令手册

一、Linux基础指令 1. ls ls&#xff1a;对于目录&#xff0c;列出该目录下的所有子目录与文件&#xff0c;对于文件&#xff0c;将列出文件名以及其他信息。 -a&#xff1a;列出目录下的所有文件&#xff0c;包含以.开头的隐藏文件 -l:列出文件的详细信息 -d&#xff1a;将目录…

《磁力下载工具实测:资源搜索+高速下载一站式解决方案》

嘿&#xff0c;朋友们&#xff01;我是阿灿&#xff0c;今天给大家带来一个超实用的看片神器&#xff0c;特别适合老司机们使用&#xff0c;保证让你眼前一亮&#xff01;推荐一款比某雷更好用的下载工具&#xff0c;搭配资源搜索神器&#xff0c;轻松获取资源不限速。超强磁力…

Go网络编程基础:网络模型与协议栈概述 - 从理论到实践的完整指南

1. 引言 在当今的互联网时代&#xff0c;网络编程已经成为后端开发的核心技能。Go语言以其出色的并发性能和简洁的语法&#xff0c;在网络编程领域展现出了强大的优势。从Docker、Kubernetes到众多微服务框架&#xff0c;Go已经成为构建高性能网络应用的首选语言之一。 你是否…

Web攻防-SSTI服务端模版注入利用分类语言引擎数据渲染项目工具挖掘思路

知识点&#xff1a; 1、WEB攻防-SSTI-利用分类&功能点 2、WEB攻防-SSTI-利用项目&挖掘思路 SSTI(Server Side Template Injection) 服务器模板注入, 服务端接收了用户的输入&#xff0c;将其作为 Web 应用模板内容的一部分&#xff0c;在进行目标编译渲染的过程中&…

李沐动手学深度学习Pytorch-v2笔记【07自动求导代码实现】

文章目录前言自动求导实现非标量变量的反向传播分离计算Python控制流的梯度计算前言 关于走动求导的理论知识个人有点难以理解&#xff0c;推荐大家去看https://blog.csdn.net/weixin_42831564/article/details/135658138这篇文章&#xff0c;讲的很好。 自动求导实现 impor…

strchr 与 strstr 函数详解

一.strchr - 字符查找函数1.函数原型char *strchr(const char *str, int c);2.核心功能在字符串中查找特定字符的第一次出现位置3.参数说明参数 类型 说明str const char* 要搜索的字符串c int 要查找的字符&#xff08;自动转换为char&#xff09;4.返回值…

jakes信道模型

Jakes 模型 前面我们介绍了多径信道合成信号可表示为&#xff1a; r(t)Re{∑i0N(t)−1ai(t)u(t−τi(t))ej2πfc(t−τi(t))ϕDi(t)} r(t)Re \left\{\sum_{i0}^{N(t)-1}a_{i}(t)u(t-\tau_{i}(t))e^{j2\pi f_{c}(t-\tau_{i}(t))\phi_{D_{i}}(t)} \right\} r(t)…

JVM类加载机制解析

什么是类加载器&#xff1f; 类加载器是JVM的核心组件之一&#xff0c;负责将Java字节码文件&#xff08;.class文件&#xff09;加载到JVM内存中。由于JVM只能执行二进制字节码&#xff0c;类加载器的作用就是将编译后的.class文件转换为JVM可以理解和执行的格式&#xff0c;使…

用Python和OpenCV从零搭建一个完整的双目视觉系统(二)

本系列文章旨在系统性地阐述如何利用 Python 与 OpenCV 库&#xff0c;从零开始构建一个完整的双目立体视觉系统。 本项目github地址&#xff1a;https://github.com/present-cjn/stereo-vision-python.git 项目架构设计&#xff1a;蓝图、分工与工作流 在上一篇文章中&#…

亿级流量下的缓存架构设计:Redis+Caffeine多级缓存实战

亿级流量下的缓存架构设计&#xff1a;RedisCaffeine多级缓存实战 一、为什么需要多级缓存&#xff1f; 在亿级流量场景下&#xff0c;单纯依赖Redis会遇到三大瓶颈&#xff1a;网络延迟&#xff1a;Redis远程访问通常需要1-5ms&#xff0c;QPS超过10万时成为瓶颈资源成本&…

AI基建还能投多久?高盛:2-3年不是问题,回报窗口才刚开启

高盛表示&#xff0c;尽管AI商业化变现仍处早期阶段&#xff0c;但基于成本削减的第一阶段回报已经显现。预测到2030年AI自动化可为财富500强企业节省约9350亿美元成本。分析师认为&#xff0c;这一早期收益足以支撑当前AI基础设施投资水平&#xff0c;尽管增长率可能放缓。虽然…

【mac】快捷键使用指南

在Mac上&#xff0c;根据选择对象的不同&#xff0c;在选择时移动的方法也有所不同&#xff0c;以下是具体介绍&#xff1a; 移动文件或文件夹&#xff1a;可通过拖放操作移动。打开“访达”&#xff08;Finder&#xff09;&#xff0c;找到要移动的文件或文件夹&#xff0c;按…

CS144 lab2 tcp_receiver

1. 实验目的 lab2 的目的是实现tcp的接收端。 主要包括两方面 &#xff08;1&#xff09; 从发送端接收消息&#xff0c;使用Reassembler聚合字节流&#xff08;Bytestream&#xff09; &#xff08;2&#xff09;将确认号&#xff08;ackno&#xff09;和window size发回对端 …

【论文笔记】A Deep Reinforcement Learning Based Real-Time Solution Policy for the TSP

《基于 DRL 和 DCNN 的实时 TSP 求解策略》IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS, VOL. 24, NO. 6, JUNE 2023一段话总结本文提出了一种基于深度强化学习&#xff08;DRL&#xff09; 和深度卷积神经网络&#xff08;DCNN&#xff09; 的实时旅行商问题&am…

MMaDA:多模态大型扩散语言模型

集众家之所长&#xff0c;成大一统。普林斯顿大学、北京大学、清华大学、字节跳动的研究者将“文本推理、多模态分析、图像生成”三大方向融合在一个单一扩散模型里&#xff0c;并用恰当的优化策略来提升模型在各个方向的性能。 研究动机 研究人员致力于开发一个能够处理多种模…

容器技术入门与Docker环境部署

容器技术入门与Docker环境部署Docker概述什么是 DockerDocker 的优势Docker 的应用场景Docker 核心概念(1)镜像(2)容器(3)仓库Docker 安装1.关闭系统防火墙和内核2.下载Docker的repo文件3.替换仓库地址4.更新索引文件并安装Docker5.添加国内镜像站6.开启Docker服务7.优化内核参…

【01】MFC入门到精通—— MFC新建基于对话框的项目 介绍(工作界面、资源视图 、类视图)

文章目录1 创建工程2 运行3 工作界面介绍3. 1 类视图 Class View3.2 如何打开 类视图3.3 资源视图1 创建工程 选择菜单项 文件->新建->项目&#xff0c;弹出 “新项目” 对话框。 选择 MFC&#xff0c;点击下一步&#xff0c;然后键入工程名称&#xff0c;本例取名“Add…

2025!在Windows的Python中安装GDAL包(小白能成!)

最近更新 在2025.06.05日&#xff0c;GDAL发布预告&#xff1a;新版本将适配pipeline和向量读写功能。 直到2025.06.25日&#xff0c;最新的版本才算发行出来。 有朋友催我赶紧更新教程&#xff0c;我上次更新是3月份的时候了&#xff0c;恰好是GDAL上一个版本出来的时间。 前…

Python第一次作业

# 1.技术面试题**&#xff08;1&#xff09;TCP与UDP的区别是什么&#xff1f;****答&#xff1a;TCP 是 “可靠但较慢” 的协议&#xff0c;适合对数据完整性要求高的场景&#xff1b;UDP 是 “快速但不可靠” 的协议&#xff0c;适合对实时性要求高的场景。两者互补&#xff…

Linux【大数据运维】下制作Redis绿色免安装包(一)

linux下安装Redis比较繁琐&#xff0c;遇到内网部署环境更是麻烦。根据经验将Redis打包一个绿色版进行使用。 大体思路&#xff0c;在一台正常的机器上面制造好安装包&#xff0c;然后上传到内网服务器&#xff0c;解压使用。 下载&#xff1a; wget https://download.redis…