当前位置: 首页 > news >正文

C++基础三

构造函数

构造函数(初始化类成员变量):
    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、系统会自动判断当前函数是否是内联函数,也会自动判别是否需要使用内联。
 

拷贝构造函数

拷贝构造函数:
    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;
}

相关文章:

C++基础三

构造函数 构造函数(初始化类成员变量)&#xff1a; 1、属于类的成员函数之一 2、构造函数没有返回类型 3、构造函数的函数名必须与类名相同 4、构造函数不允许手动调用(不能通过类对象调用) 5、构造函数在类对象创建时会被自动调用 6、如果没有显示声…...

利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛:台风预测与分析

利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛&#xff1a;台风预测与分析 引言 在2024年MathorCup大数据挑战赛中&#xff0c;赛道A聚焦于气象数据分析&#xff0c;特别是台风的生成、路径预测、和降水风速特性等内容。本次比赛的任务主要是建立一个分类评价模型&…...

Linux系统操作篇 one -文件指令及文件知识铺垫

Linux操作系统入门-系统篇 前言 Linux操作系统与Windows和MacOS这些系统不同&#xff0c;Linux是黑屏的操作系统&#xff0c;操作方式使用的是指令和代码行来进行&#xff0c;因此相对于Windows和MacOS这些带有图形化界面的系统&#xff0c;Linux的入门门槛和上手程度要更高&…...

隨筆20241028 ISR 的收缩与扩展及其机制解析

在 Kafka 中&#xff0c;ISR&#xff08;In-Sync Replicas&#xff09; 是一组副本&#xff0c;它们与 Leader 保持同步&#xff0c;确保数据一致性。然而&#xff0c;ISR 的大小会因多种因素而变化&#xff0c;包括收缩和扩展。以下是 ISR 收缩与扩展的详细解释及其背后的机制…...

linux-字符串相关命令

1、cut 提取文件每一行中的内容 下面是一些常用的 cut 命令选项的说明&#xff1a; -c, --characters列表&#xff1a;提取指定字符位置的数据。-d, --delimiter分界符&#xff1a;指定字段的分隔符&#xff0c;默认为制表符。-f, --fieldsLIST&#xff1a;提取指定字段的数据…...

ES6 函数的扩展

ES6 之前&#xff0c;不能直接为函数的参数指定默认值&#xff0c;只能采用变通的方法 ES6 允许为函数的参数设置默认值&#xff0c;即直接写在参数定义的后面 参数变量是默认声明的&#xff0c;所以不能用 let 或 const 再次声明 使用参数默认值时&#xff0c;函数不能有同名参…...

Mac 查看占用特定端口、终止占用端口的进程

在 macOS 上&#xff0c;可以使用以下命令来查看占用特定端口&#xff08;例如 8080&#xff09;的进程&#xff1a; lsof -i :8080命令说明 lsof&#xff1a;列出打开的文件和网络连接信息。-i :8080&#xff1a;筛选出正在监听 8080 端口的进程。 输出结果结构 执行上述命…...

C#入坑JAVA MyBatis入门 CURD 批量 联表分页查询

本文&#xff0c;分享 MyBatis 各种常用操作&#xff0c;不限于链表查询、分页查询等等。 1. 分页查询 在 下文的 的「3.4 selectPage」小节&#xff0c;我们使用 MyBatis Plus 实现了分页查询。除了这种方式&#xff0c;我们也可以使用 XML 实现分页查询。 这里&#xff0c…...

RabbitMQ 安装(Windows版本)和使用

安装 安装包获取 可以自己找资源&#xff0c;我这里也有百度云的资源&#xff0c;如果没失效的话可以直接用。 通过百度网盘分享的文件&#xff1a;RabbitMQ 链接&#xff1a;https://pan.baidu.com/s/1rzcdeTIYQ4BqzHLDSwCgyw?pwdfj79 提取码&#xff1a;fj79 安装教程…...

Apache paimon表管理

表管理 2.9.4.1 管理快照 1)快照过期 Paimon Writer每次提交都会生成一个或两个快照。每个快照可能会添加一些新的数据文件或将一些旧的数据文件标记为已删除。然而,标记的数据文件并没有真正被删除,因为Paimon还支持时间旅行到更早的快照。它们仅在快照过期时被删除。 …...

java 第19天

一.Lambda表达式 前提是&#xff1a;参数是函数式接口才可以书写Lambda表达式 函数式接口条件&#xff1a; 1.接口 2.只有一个抽象方法 lambda表达式又称为匿名函数&#xff0c;允许匿名函数以参数的形式传入方法&#xff0c;简化代码 lambda表达式分为两部分()->{} …...

什么是服务器?服务器与客户端的关系?本地方访问不了网址与服务器访问不了是什么意思?有何区别

服务器是一种高性能的计算机&#xff0c;它通过网络为其他计算机&#xff08;称为客户端&#xff09;提供服务。这些服务可以包括文件存储、打印服务、数据库服务或运行应用程序等。服务器通常具有强大的处理器、大量的内存和大容量的存储空间&#xff0c;以便能够处理多个客户…...

Spring(1)—Spring 框架:Java 开发者的春天

一、关于Spring 1.1 简介 Spring 框架是一个功能强大的开源框架&#xff0c;主要用于简化 Java 企业级应用的开发&#xff0c;由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立&#xff0c;并由Pivotal团队维护。它提供了全面的基础设施支持&#xff0c;使开发者…...

MT1401-MT1410 码题集 (c 语言详解)

目录 MT1401归并排序 MT1402堆排序 MT1403后3位排序 MT1404小大大小排序 MT1405小大大小排序II MT1406数字重排 MT1407插入 MT1408插入 MT1409旋转数组 MT1410逆时针旋转数组 MT1401归并排序 c 语言实现代码 #include <stdio.h>// merge two subarrays void merge(int a…...

React基础语法

1.React介绍 React由Meta公司开发&#xff0c;是一个用于构建Web和原生交互界面的库 1.1 React优势 相较于传统基于DOM开发的优势 1.组件化的开发方式 2.不错的性能 相较于其他前端框架的优势 1.丰富的生态 2.跨平台支持 1.2React的时长情况 全球最流行&#xff0c;大厂…...

《Kadane‘s Algorithm专题:最大和连续子数组》

&#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f31f; 在这里&#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人&#xff0c;我不仅热衷…...

Vue基础(5)

ref属性 在 Vue2 中&#xff0c;ref是一个特殊的属性&#xff0c;用于在模板中获取对某个 DOM 元素或子组件的引用。通过 ref&#xff0c;我们可以在 JavaScript 代码中直接访问该 DOM 元素或组件实例。 示例: <template><div><input ref"inputField&quo…...

面对复杂的软件需求:5大关键策略!

面对软件需求来源和场景的复杂性&#xff0c;有效地管理和处理需求资料是确保项目成功的关键&#xff0c;能够提高需求理解的准确性&#xff0c;增强团队协作和沟通&#xff0c;降低项目风险&#xff0c;提高开发效率。反之&#xff0c;项目可能面临需求理解不准确、团队沟通不…...

使用Git进行版本控制的最佳实践

文章目录 Git简介基本概念仓库&#xff08;Repository&#xff09;提交&#xff08;Commit&#xff09;分支&#xff08;Branching&#xff09; 常用命令初始化仓库添加文件提交修改查看状态克隆仓库分支操作合并分支推送更改 最佳实践使用有意义的提交信息定期推送至远程仓库使…...

【入门1】顺序结构 - B2025 输出字符菱形

题目描述 用 * 构造一个对角线长 55 个字符&#xff0c;倾斜放置的菱形。 输入格式 没有输入要求。 输出格式 如样例所示。用 * 构成的菱形。 输入输出样例 输入 #1 输出 #1**** ********* <C> : #include<stdio.h>int main() {printf(" *\n ***\n**…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...