C++基础三(构造函数,形参默认值,函数重载,单例模式,析构函数,内联函数,拷贝构造函数)

    C++有六个默认函数,分别是:   

 1、默认构造函数;   

 2、默认拷贝构造函数;     

3、默认析构函数;   

 4、赋值运算符;   

 5、取址运算符;     

6、取址运算符const;

构造函数

构造函数(初始化类成员变量):
    1、属于类的成员函数之一
    2、构造函数没有返回类型
    3、构造函数的函数名必须与类名相同
    4、构造函数不允许手动调用(不能通过类对象调用)
    5、构造函数在类对象创建时会被自动调用
    6、如果没有显示声明构造函数,系统会生成一个默认的构造函数
    7、如果显示声明了构造函数,那么默认构造函数将不会在被创建
    8、构造函数不被设置为静态成员函数
    9、构造函数的函数首部之前或函数首部之后不能用const修饰
    10、new一个类指针也会触发构造函数的调用, malloc不会
    11、构造函数通过函数重载的方式也可以拥有多个
    12、构造函数也可以使用形参默认值
    13、构造函数可以是private的

#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;#if 0 // 构造函数class Node
{public://Node();Node(int n = 0, char* ptr = NULL, float score = 1.3f);// static Node(); // error// Node() const;  // error// const Node();  // errorprivate:int m_num;char* m_ptr;float m_fscore;
};// 类成员变量初始化方式2(常用这种方式)
// 通常普通类成员变量都需要在构造函数上进行初始化。
//Node::Node() 
//    : m_num(111),
//      m_ptr(NULL),
//      m_fscore(0.0) 
//{
//    // 类成员变量初始化方式1:
//    //m_num = 10;
//
//    cout << "construct: " << m_num << endl;
//}Node::Node(int n, char* ptr, float score): m_num(n),m_ptr(NULL),m_fscore(score)
{m_ptr = new char[100];strcpy(m_ptr, ptr);cout << m_num << " : " << m_ptr << " : " << m_fscore << endl;
}int main(int argc,char *argv[])
{// 触发构造函数调用Node n;// n.Node(); // errorNode n1(1, "st", 1.1);// 触发构造函数调用//Node* n1 = new Node;// 不会触发构造函数调用//Node* n2 = (Node*)malloc(sizeof(Node));return 0;
}
#endif

形参默认值

形参默认值:
    1、给函数的形参一个默认的值。
    2、如果我们在调用函数时指定实参的值,则形参的默认值不生效。
    3、如果调用函数时没有给实参值,形参默认值才会生效。
    4、形参默认值只需要在函数声明时写出来即可。
       如果有函数声明的前提下, 在函数定义时写形参默认值会报错。
    5、形参默认值只能出现在形参列表的最右边(后边)。

#if 0 // 形参默认值class Node
{public:// 形参默认值void fun(int x, int y, int num = 12, int z = 1);void display();private:int m_num;
};void Node::fun(int x, int y, int num, int z)
{m_num = num;
}void Node::display()
{cout << m_num << endl;
}int main()
{Node n;n.fun(1, 2, 12345);n.display();n.fun(1, 2);n.display();return 0;
}#endif

函数重载

函数重载:
    1、在C++允许出现同名函数
      (1) 形参个数不同
      (2) 形参类型不同
      (3) 形参顺序不同: 前提类型不同
      (4) 函数的返回类型不影响
    2、函数重载时,调用函数是在编译期间就确定了具体调用对象,
       因为我们将函数重载称之为静态联编
    3、重载函数调用时,不要出现二义性问题

#if 0 // 函数重载
#include <stdio.h>void fun(int x, float y)
{cout << "fun(int x, float y)" << endl;
}void fun(int x, int y)
{cout << "void fun(int x, int y)" << endl;
}void fun(int x, int y, int z = 0)
{cout << "void fun(int x, int y, int z = 0)" << endl;
}void fun()
{cout << "fun()" << endl;
}void fun(float x, int y)
{cout << "fun(float x, int y)" << endl;
}int main()
{   fun(1.1f, 12);fun(12, 1.3f);fun(1, 2, 3);fun(1, 2); // error: 出现了二义性return 0;
}#endif

单例模式

#if 1 // 设计模式:单例模式class Node
{public:static Node* getInstance();private:Node();private:static Node* m_ptr;
};Node* Node::m_ptr = NULL;Node::Node()
{cout << "construst" << endl;
}Node* Node::getInstance()
{if (m_ptr == NULL){m_ptr = new Node;}return m_ptr;
}int main()
{//Node n; // error: ‘Node::Node()’ is private//Node* n1 = new Node; // error: ‘Node::Node()’ is private//Node* n2 = (Node*)malloc(sizeof(Node)); // 可以Node* n = Node::getInstance();cout << n << endl; Node* n1 = Node::getInstance();cout << n1 << endl; Node* n2 = Node::getInstance();cout << n2 << endl; Node* n3 = Node::getInstance();cout << n3 << endl; Node* n4 = Node::getInstance();cout << n4 << endl; return 0;
}

析构函数

析构函数:
    1、类对象或类指针销毁时析构函数会被自动调用
    2、如果没有显示声明析构函数,则系统会生成一个默认的析构函数
    3、如果显示声明了析构函数,则不会在生成默认的析构函数
    4、析构函数没有返回类型,没有形参列表,且函数名与类名相同
    5、析构函数只有一个,不能重载
    6、析构函数不能设置为私有的
    7、析构函数可以手动调用,但不允许
    8、如果类对象的作用域相同,那么在销毁时析构函数的执行顺序与构造相反。

#include <iostream>
using namespace std;class Node
{public:Node();Node(int n);~Node();//~Node(int num = 0); // error: destructors may not have parametersvoid fun();inline void fun1(){cout << "fun1" << endl;}private:int* m_ptr;
};Node::Node(): m_ptr(NULL)
{if (m_ptr == NULL){m_ptr = new int[100];}cout << "construct" << endl;
}Node::Node(int n): m_ptr(NULL)
{if (m_ptr == NULL){m_ptr = new int[100];}*m_ptr = n;cout << *m_ptr << "construct"  << endl;
}void Node::fun()
{Node n(8);cout << "fun" << endl;
}Node::~Node()
{cout << *m_ptr << "destruct" << endl;if (m_ptr != NULL){delete[] m_ptr;m_ptr = NULL;}
}int main(int argc,char *argv[])
{Node n0(0), n2(2);n0.fun();Node n3(3), n4(4), n5(5);//Node* n1 = new Node;//delete n1;// n0.~Node(); // 可以但不允许cout << "aaa" << endl;return 0;
}

内联函数

内联函数:
    1、在普通类成员函数声明之前添加 inline 关键字
    2、内联函数通常函数定义和函数声明都写在类声明中
    3、内联函数的函数体中不能出现复杂结构
    4、函数函数体中的代码一般3行左右
    5、通常被频繁调用的函数才需要设置为内联函数
    6、内联函数是进行函数逻辑的替换,其不进行真正的函数调用,减少系统开销
    7、系统会自动判断当前函数是否是内联函数,也会自动判别是否需要使用内联。

内联函数与c的宏函数有什么不同

1、宏函数是在编译阶段处理,是纯字符串替换; 内联函数是运行阶段处理,是函数逻辑替换; 2、宏函数无法调试;  内 联函数可以调试;

3、宏函数没有返回值;   内联函数有返回值;

4、宏函数不能访问类成员; 内联函数可以访问类成员;

拷贝构造函数

拷贝构造函数:
    1、拷贝构造函数属于构造函数的重载
    2、拷贝构造函数,要求形参中有一个当前类的类对象的引用
    3、如果没有显示声明拷贝构造函数,系统会生成一个默认的拷贝构造函数
    4、如果显示声明了拷贝构造函数,那么默认拷贝构造函数将不会在被创建
    5、当使用一个老对象去构造一个新对象时会调用拷贝构造函数
        (1) 用一个老对象构造一个新对象,或者新对象赋给老对象。
        (2) 当函数的形参是一个非引用的类对象时,实参到形参传递时。
        (3) 函数返回一个非引用的类对象时。
    6、如果没有显示声明和定义拷贝构造函数时,类中的非指针类成员的值是可以被拷贝的。
       默认拷贝构造函数负责执行了值的拷贝。
    7、如果显示声明和定义拷贝构造函数后,类中的所有成员变量都需要我们手动进行拷贝。
    8、拷贝分为浅拷贝和深拷贝,默认拷贝构造函数只能进行浅拷贝。
    9、浅拷贝只进行值的拷贝,深拷贝还会执行内存拷贝。

#include <iostream>
using namespace std;class Node
{public:Node();Node(const Node& n);~Node();private:int m_num;int* m_ptr;
};Node::Node(): m_num(12),m_ptr(NULL)
{if (m_ptr == NULL){m_ptr = new int[100];}*m_ptr = 123;cout << "construct" << m_num << " -- " << *m_ptr << endl;
}Node::Node(const Node& n): m_num(0)
{if (m_ptr == NULL){m_ptr = new int[100];}*m_ptr = *(n.m_ptr);cout << "copy construct" << m_num << " -- " << *m_ptr << endl;
}Node::~Node()
{cout << "destruct: " << m_num << " -- " << *m_ptr << " : " << m_ptr << endl;if (m_ptr != NULL){delete[] m_ptr;m_ptr = NULL;}
}int main(int argc,char *argv[])
{Node n1;Node n2(n1);return 0;
}


#include <iostream>
using namespace std;class Node
{public:Node();Node(const Node& n);~Node();Node fun(Node n);private:int m_num;
};Node::Node(): m_num(12)
{cout << "construct: " << m_num << endl;
}Node::Node(const Node& n): m_num(0)
{cout << "copy construct: " << m_num << endl;
}Node Node::fun(Node n)
{n.m_num = 111;cout << "fun" << endl;return n;
}Node::~Node()
{cout << "destruct: " << m_num << endl;
}int main(int argc,char *argv[])
{Node n1;//Node n2(n1);//Node n3 = n1;//Node n3 = n1.fun(n1);// 如果有返回,但我们没有接收的时候,系统会自动生成一个临时(隐藏)对象// 当前的临时(隐藏)对象的生存周期是从return开始,当前函数调用语句执行完毕结束。n1.fun(n1);cout << "---------" << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LEADTOOLS 版本 23 现已发布,引入了 Excel API等众多新功能!

LEADTOOLS 以其在全世界主要国家中占有的市场领导地位&#xff0c;在数码图象开发工具领域中已成为既定的全球领导者&#xff0c;其不断发展和扩展功能&#xff0c;以帮助开发人员构建更好、更强大的应用程序。最新发布的 LEADTOOLS 版本 23引入了许多新功能&#xff0c;包括新…

鸿蒙系统的优势 不足以及兼容性与未来发展前景分析

2024 年 10 月 22 日&#xff1a;华为正式发布原生鸿蒙操作系统 HarmonyOS next&#xff0c;并正式命名为 HarmonyOS 5&#xff0c;这是鸿蒙系统史上最大的升级&#xff0c;实现了国产操作系统从底层架构到应用生态的全面自主可控。 鸿蒙系统与安卓、iOS 相比&#xff0c;具有…

Hive 2.x 的安装与配置

Hive 2.x 的安装与配置 1 简介 基于Hadoop的一个数据仓库工具&#xff0c;可将结构化数据文件映射为一张数据库表&#xff0c;并提供简单[SQL]查询&#xff0c;可将SQL语句转换为MapReduce任务进行运行。 优点 学习成本低&#xff0c;可通过类SQL语句快速实现简单的MapReduce统…

关于图像客观指标的调试总结

1、问题背景 工作中经常有调试图像客观指标的需求&#xff0c;很容易遇到我们自己的环境测试是过的&#xff0c; 但客户那边的环境就是测不过&#xff0c;这时候该怎么办呢&#xff1f; 2、问题分析 首先要改变以往的工作思路&#xff0c;在调试的过程中不能说指标过了就完了&a…

VulkanTutorial(14·descriptor,uniform buffer)

Uniform buffers Descriptor layout and buffer 我们将继续学习3D图形&#xff0c;这需要一个模型-视图-投影矩阵&#xff0c;因此我们要更改向vertex shader传输的数据&#xff0c;也就是通过vertex buffer 但是当实时渲染&#xff0c;每一帧这些数据都有可能变化&#xff0…

Kafka存储机制大揭秘:从日志结构到清理策略的全面解析

文章目录 一、前言二、日志存储结构1.日志文件结构2.topic3.partition4.segment索引文件5.message结构6.message查找过程 三、存储策略1.顺序写2.页缓存3.零拷贝4.缓存机制 四、日志格式演变1.V0 版本2.V1 版本3.V0/V1消息集合4.V2 版本消息格式5.V2版本消息集合 五、偏移量维护…

基于OSS搭建在线教育视频课程分享网站

OSS对象存储服务是海量、安全、低成本、高持久的存储服务。适合于存储大规模非结构化数据&#xff0c;如图片、视频、备份文件和容器/虚拟机镜像等。 安装nginx wget https://nginx.org/download/nginx-1.20.2.tar.gz yum -y install zlib zlib-devel gcc-c pcre-devel open…

HCIA笔记整合

第一部分&#xff1a; OSI七层模型 应用层&#xff1a;人机交互 抽象语言--------编码 表示层&#xff1a;编码------二进制 会话层&#xff1a;提供会话号 传输层&#xff1a;TCP/UDP 分段&#xff08;收到MTU值的限制&#xff09; MTU&#xff1a;最大传输单元&#xff…

如何选择到印尼的海运代理

如何选择到印尼的海运代理 选择合适的海运代理的重要性 海运代理负责安排货物从发货地到目的地的整个运输过程&#xff0c;包括装运、清关、仓储等服务。一个可靠的海运代理能确保货物安全准时到达&#xff0c;并帮助企业节省时间和成本。 选择海运代理需考虑的主要因素 公司…

RK3588的QT交叉编译环境搭建

主要参考为RK3568或RK3288开发板创建交叉编译环境{采用amd64的ubuntu系统配置交叉编译arm64开发环境}(保姆级包括安装QT)超详细记录版_rk3568交叉编译-CSDN博客 先说一下&#xff0c;使用的Ubuntu20.04.5版本&#xff0c;qt源码用的5.14.2版本&#xff0c;交叉编译器使用RK3588…

【Linux】一些Shell脚本编程基础题

目录 一、比较两个数的大小 二、求1-100的素数和 三、编写shell脚本&#xff0c;输入一个数字n并计算1~n的和&#xff0c;同时要求如果输入的数字小于1&#xff0c;则重新输入&#xff0c;直到输入正确的数字为止。 四、编写一个shell脚本用来进行成绩等级评定&#xff0c;…

数据的表现形式(2)

汉字字形码 字形码也叫字模或汉字输出码。字形码是表示汉字字型信息的编码&#xff0c;用来实现计 算机对汉字的输出 如一个16*16点阵的字形码就需要16*16/8个字节的存储空间 二进制的运算 在定点二进制运算中&#xff0c;减法运算一般通过【补码运算的二进制加法器】 进制三要…

Vision - 开源视觉分割算法框架 Grounded SAM2 配置与推理 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143388189 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ground…

深度学习基础—语言模型和序列生成

引言 深度学习基础—循环神经网络&#xff08;RNN&#xff09;https://blog.csdn.net/sniper_fandc/article/details/143417972?fromshareblogdetail&sharetypeblogdetail&sharerId143417972&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 上…

leetcode-3-无重复字符的最长子串

题解&#xff1a; 1、初始化一个字典dic_hash{}。 2、初始化左指针i-1&#xff0c;右指针j为s的索引。 #3、初始化变量res1用3 2Q#来 |} 】、 代码&#xff1a;

readhat虚拟机基本操作

1.用cat显示/etc/passwd&#xff0c;并显示行号 2.在当前目录下创建空文件夹/web/test1 3.查看当前工作目录的命令 4.显示环境变量$PATH 5. 查看/tmp/目录的使用空间 6. 删除空目录old 要删除old,要先建立old目录---mkdir old&#xff0c;然后ls查看是否建立成功&#xff0c;再…

Java面试经典 150 题.P80. 删除有序数组中的重复项 II(004)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums)…

基尼指数(Gini Impurity)的理解和计算

基尼不纯度简介 - Gini Impurity - 吕汉鸿 - 博客园 先看上面这个博文&#xff01;&#xff01;&#xff01;然后再看下面的&#xff0c;下面这个原博文有一点问题。已修正&#xff0c;修正后的完整内容如下 一、基尼指数的概念 基尼指数&#xff08;Gini不纯度&#xff09;…

《股市行情预测软件:开发之路的探索与挑战》

《股市行情预测软件&#xff1a;开发之路的探索与挑战》 一、股市行情预测软件的重要性二、开发所需技术&#xff08;一&#xff09;数据收集与处理技术&#xff08;二&#xff09;数据分析技术&#xff08;三&#xff09;算法选择与应用&#xff08;四&#xff09;编程语言与开…

整合全文检索引擎 Lucene 添加站内搜索子模块

整合全文检索引擎 Lucene: 添加站内搜索子模块 1. 什么是 Lucene ? 有啥优势&#xff1f; Lucene 是一个开源的全文检索引擎库&#xff0c;由 Apache 基金会维护&#xff0c;官网地址&#xff1a;https://lucene.apache.org/ 。它提供了丰富的文本处理和搜索功能&#xff0c…