c++之类的初始化

本文对类的初始化方法进行梳理总结,类的初始化方法有多种形式,针对不同的变量也不一样。下面进入正题。

  • 类的构造函数初始化列表方式:这种初始化方式都很熟悉,也是我们经常使用的初始化方式,这里面涉及构造函数的种类(默认构造函数、拷贝构造函数、赋值构造函数、右值引用构造函数、赋值运算符重载、右值引用赋值运算符重载),本专栏有专门的文章进行介绍,这里不再展开。下面给出一些典型的例子:
class Example
{private:int num;std::string str;public:Example(int value, std::string string):num(value),str(string){}  //初始化列表的方式进行初始化
}
  • 默认成员初始化方式:这是c++11引入的特性,怎么理解呢?就是在类声明时可以对某些变量进行初始化,而在c++11版本之前是不行的,在c++11之前的版本中只有const类型的变量才可以在类声明时进行初始化。请看下面的例子:
//c++98版本
class Example
{private:int num = 0; //编译报错,不支持这样的初始化std::string str = "hello";  //编译报错std::vector<int> vect{1,2,3,4,5};  //编译报错const int num1 = 2;  //编译通过,仅支持const类型的变量在声明时定义
}//c++11版本及以后
class Example
{private:int num = 0;  //默认初始化为0  正确std::string str = "hello";   正确std::vector<int> vect{1,2,3,4,5};  //正确static int number = 1;  //错误,静态成员变量的定义另有规则
}
  • 列表初始化方式(聚合初始化):其实这个就是通过大括号的方式进行初始化,在c++98版本及之后的版本形式不太一样,请看下面的例子:
//例子一
struct Point
{int x;int y;
};Point p1={1,2}; //c++98版本这样通过列表进行初始化
Point p2{1,2}; //c++11及之后版本的列表初始化 x=1,y=2//例子二
struct Point
{int y;int x;double z;char h;
};Point p2{1,2,3.14,'a'}; //c++11及之后版本的列表初始化 y=1,x=2,z=3.14,h='a'//例子三
struct Point
{int x;double y;
};
Point p3{3.14, 5.55};  //编译报错,在初始化列表时不支持窄化转换double->int// 嵌套结构体初始化
struct Rectangle {Point topLeft;Point bottomRight;
};Rectangle rect{{0,0}, {1,1}};  // 嵌套列表初始化

注意上面的例子, 

(1)使用初始化列表初始化时大括号的顺序一定是与类的参数声明顺序严格一致的

(2)使用初始化列表方式进行初始化,不允许(窄化转换),例如讲一个double转换为int类型,在通过列表初始化时是不允许这种操作的,例如上面的例子三

(3)这种初始化方法仅在未定义构造函数的情况才会生效,如果存在构造函数,则会优先调用对应的构造函数,请看下一小节。

  • 统一初始化语法:与列表初始化方式类似,不同的是统一初始化语法存在对应的构造函数。请看下面的例子:
class Example
{private:int x;bool y;public:Example(int x, bool y):x(x),y(y){}  //构造函数1Example(){}  //构造函数2
};Example example0{}  //调用构造函数2
Example example{1,true};  //此处调用构造函数
  • 静态成员变量初始化:静态成员变量的初始化有多种情况(const类型的静态成员变量、非const类型的静态成员变量)。对于const类型成员变量必须在类声明时进行初始化;对于非const类型的成员变量,在c++17版本之前不允许在类声明时初始化,必须在cpp文件进行初始化,但是在c++17版本之后可以在类声明中进行初始化,但是必须结合关键字inline。请看下面的例子:
class Example
{prvate:static const int num = 0;  //编译通过static const string str = "hello";  //编译不通过static int num1 = 2;  //编译报错static int num1;inline static int num2 = 3;  //c++17版本及之后结合inline关键字可以在类声明中对非const类型静态成员进行初始化
}//cpp文件int Example::num1 = 2;  //c++17版本之前必须在外部初始化

需要注意的是const类型静态成员变量的初始化仅支持整型,对于非整型的const静态成员变量的初始化不支持,例如double,std::string 类型等

  • 初始化顺序:初始化都是按照声明的顺序进行初始化的
class Base {int x;
public:Base() : x(0) {}  // 基类初始化
};class Derived : public Base {int a;int b;int c;public:// 初始化顺序按照声明顺序,不是初始化列表的顺序Derived() : c(1)    // 虽然c在最后声明,但这里最先初始化不会影响顺序, a(2)    // 实际上a会在b之前初始化, b(3)    // b最后初始化{}
};

注意事项

  • 列表初始化方式支持不同的类型的列表初始化,怎么理解呢,假设一个类有两个不同类型的成员变量,使用列表初始化方式的顺序一定是与声明的顺序保持一致的。

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

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

相关文章

FTP 实验(ENSP模拟器实现)

目录 FTP 概述 FTP实验 FTP的报文交互 FTP 概述 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型&#xff0c;客户端通过…

Elasticsearch:使用经过训练的 ML 模型理解稀疏向量嵌入

作者&#xff1a;来自 Elastic Dai Sugimori 了解稀疏向量嵌入&#xff0c;理解它们的作用/含义&#xff0c;以及如何使用它们实现语义搜索。 Elasticsearch 提供语义搜索功能&#xff0c;允许用户使用自然语言进行查询并检索相关信息。为此&#xff0c;目标文档和查询必须首先…

Java进阶(vue基础)

目录 1.vue简单入门 ?1.1.创建一个vue程序 1.2.使用Component模板(组件&#xff09; 1.3.引入AXOIS ?1.4.vue的Methods&#xff08;方法&#xff09; 和?compoted&#xff08;计算&#xff09; 1.5.插槽slot 1.6.创建自定义事件? 2.Vue脚手架安装? 3.Element-UI的…

密码学基础

第1节 密码学概述 密码是人类在信息活动中的一项伟大发明&#xff0c;是保护秘密信息的工具。它诞生于公元前两千余年的埃及&#xff0c;迄今已有四千多年的历史。在出现年代有可查证记录的科学技术中&#xff0c;密码是历史最为悠久的科学技术之一。 百度百科里对密码的解释&…

Java入门级小案例:网页版简易计算器

网页版简易计算器 目录 网页版简易计算器需求&#xff1a;代码实现&#xff1a;效果显示 需求&#xff1a; 用HTML、CSS、JS进行书写一个具备一定功能的简易计算器。 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta cha…

【Uniapp-Vue3】导入uni-id用户体系

在uniapp官网的uniCloud中下载uni-id用户体系 或者直接进入加载&#xff0c;下载地址&#xff1a;uni-id-pages - DCloud 插件市场 进入以后下载插件&#xff0c;打开HbuilderX 选中项目&#xff0c;点击确定 点击跳过 点击合并 右键uniCloud文件夹下的database文件夹&#x…

Python 入门教程(2)搭建环境 | 2.3、VSCode配置Python开发环境

文章目录 一、VSCode配置Python开发环境1、软件安装2、安装Python插件3、配置Python环境4、包管理5、调试程序 前言 Visual Studio Code&#xff08;简称VSCode&#xff09;以其强大的功能和灵活的扩展性&#xff0c;成为了许多开发者的首选。本文将详细介绍如何在VSCode中配置…

Spring Boot电影评论网站系统设计与实现

随着互联网和娱乐产业的发展&#xff0c;电影评论网站逐渐成为人们分享观影体验、交流影评的重要平台。本文将介绍一个基于Spring Boot框架开发的电影评论网站系统的功能设计与实现方案。 功能模块概述 该电影评论网站系统分为管理员模块和用户模块两大核心部分&#xff0c;以…

RT-Thread+STM32L475VET6——TF 卡文件系统

文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行USB配置1.1 使用外部高速时钟&#xff0c;并修改时钟树1.2 打开SPI1&#xff0c;参数默认即可(SPI根据自己需求调整&#xff09;1.3 打开串口&#xff0c;参数默认1.4 生成工程 2.配置SPI2.1 打开SPI驱动2.2 声明使用SPI…

LabVIEW形状误差测量系统

在机械制造领域&#xff0c;形状与位置公差&#xff08;GD&T&#xff09;直接影响装配精度与产品寿命。国内中小型机加工企业因形状误差导致的返工率高达12%-18%。传统测量方式存在以下三大痛点&#xff1a; ​ 设备局限&#xff1a;机械式千分表需人工读数&#xff0c;精度…

【c语言】字符函数和字符串函数(1)

一、字符分类函数 c语言中有部分函数是专门做字符分类的&#xff0c;也就是一个字符是属于什么类型的字符&#xff0c;这些函 数的使用要包含一个头文件ctype.h中。 其具体如下图所示&#xff1a; 这些函数的使用方式都类似&#xff0c;下面我们通过一个函数来看其…

【Python LeetCode 专题】动态规划

斐波那契类型70. 爬楼梯746. 使用最小花费爬楼梯198. 打家劫舍740. 删除并获得点数矩阵62. 不同路径方法一:二维 DP方法二:递归(`@cache`)64. 最小路径和63. 不同路径 II120. 三角形最小路径和221. 最大正方形字符串139. 单词拆分5. 最长回文子串516. 最长回文子序列72. 编…

Linux相关知识(文件系统、目录树、权限管理)和Shell相关知识(字符串、数组)

仅供自学&#xff0c;请去支持javaGuide原版书籍。 1.Linux 1.1.概述 Linux是一种类Unix系统。 严格来讲&#xff0c;Linux 这个词本身只表示 Linux内核&#xff0c;单独的 Linux 内核并不能成为一个可以正常工作的操作系统。所以&#xff0c;就有了各种 Linux 发行版&#…

第九节: Vue 3 中的 provide 与 inject:优雅的跨组件通信

文章目录 前言什么是 provide 和 inject&#xff1f;provide 的基本使用inject 的基本使用provide 提供响应式数据数据provide 提供修改数据的方法provide 提供只读响应数据provide 使用symbol作为注入名inject 默认值总结 前言 在 Vue 3 中&#xff0c;provide 和 inject 是一…

prometheus+node_exporter+grafana监控K8S信息

prometheusnode_exportergrafana监控K8S 1.prometheus部署2.node_exporter部署3.修改prometheus配置文件4.grafana部署 1.prometheus部署 包下载地址&#xff1a;https://prometheus.io/download/ 将包传至/opt 解压 tar xf prometheus-2.53.3.linux-amd64.tar.gz 移动到…

C/C++流星雨

系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…

理解 MHA、GQA、MQA 和 MLA:多头注意力的变种及其应用

在深度学习、自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;中&#xff0c;多头注意力&#xff08;Multi-Head Attention, MHA&#xff09;是 Transformer 结构的核心。近年来&#xff0c;MHA 产生了多个变体&#xff0c;如 GQA&#xff08;G…

Crack SmartGit

感谢大佬提供的资源 一、正常安装SmartGit 二、下载crackSmartGit crackSmartGit 发行版 - Gitee.com 三、使用crackSmartGit 1. 打开用户目录&#xff1a;C:\Users%用户名%\AppData\Roaming\syntevo\SmartGit。将crackSmartGit.jar和license.zip拷贝至 用户目录。 2. 用户…

将CUBE或3DL LUT转换为PNG图像

概述 在大部分情况下&#xff0c;LUT 文件通常为 CUBE 或 3DL 格式。但是我们在 OpenGL Shader 中使用的LUT&#xff0c;通常是图像格式的 LUT 文件。下面&#xff0c;我将教大家如何将这些文件转换为 PNG 图像格式。 条形LUT在线转换&#xff08;不是8x8网络&#xff09;&am…

关于命令行下的 git( git add、git commit、git push)

文章目录 关于 gitgit 的概念git 操作&#xff08;git add、git commit、git push 三板斧&#xff09;安装 git新建仓库及配置git clone.gitignoregit addgit commitgit push其他 git 指令git pull&#xff08;把远端的东西拉到本地进行同步&#xff09;其他指令 关于 git git…