C++语法基础(二)

C++复合类型

结构体

   1.     C++的结构,定义结构体类型的变量时,可以省略struct关键字

   2.    可以定义成员函数,在结构体中的成员函数内部可以直接访问本结构体的成员,无需通过“.”或“->”

联合

1.    C++的联合,定义联合体类型的变量时,可以省略union关键字
2.    支持匿名联合     

3.    重点:共用一块内存空间        

枚举

1.    C++的枚举,定义枚举型的变量时,可以省略enum关键字
2.    独立的类型,和整型之间不能隐式转换.

代码演示 

#include<iostream>
#include<cstring>
using namespace std;void testStruct(){struct Student{int m_age;char m_name[128];void getInfo(){cout << m_name << ":" << m_age << endl;}};/*struct*/ Student s1;s1.m_age = 18;strcpy(s1.m_name, "林枫");s1.getInfo();cout << "姓名:" << s1.m_name << ", 年龄:" << s1.m_age << endl;
}
void testUnion(){union /*A*/{//匿名联合主要想体现 成员的内存排布方式(共用同一块内存空间)int i;char c[4];};//Union A a;  //C语言写法//A a;        //C++写法i = 0x12345678;//cout << c[0] << ' ' << c[1] << ' ' << c[2] //        << ' ' << c[3] << endl;//输出对应字符cout << hex << (int)c[0] << ' ' << (int)c[1] << ' ' << (int)c[2]<< ' ' << (int)c[3] << endl;
}
void testEnum(){enum Color{ red,green,blue };//C语言写法//enum Color c = red// 0-err//枚举类型不支持隐式转换//C++写法Color c = red;Color d = green;Color e = blue;cout << "c = " << c << endl;cout << "d = " << d << endl;cout << "e = " << e << endl;
}
void testBool(){bool a = true;//"";"fddgd"bool b = false;"0.0000";"123";NULL;cout << "a = " << a << ", b = " << b << endl;cout << boolalpha << "a = " << a << ", b = " << b << endl;
}
int main(){testStruct();testUnion();testEnum();testBool();return 0;
}

布尔类型

表示布尔量的数据类型
 -->bool
布尔类型的字面值常量
-->true表示真         -->false表示假

布尔类型的本质        - 单字节整数

        用1和0表示真和假

任何基本类型都可以被隐式转换为布尔类型

        非0即真,0即假

代码演示 

#include<iostream>
using namespace std;void testBool(){bool a = true;//"";"fddgd"bool b = false;"0.0000";"123";NULL;cout << "a = " << a << ", b = " << b << endl;cout << boolalpha << "a = " << a << ", b = " << b << endl;
}
int main(){testBool();return 0;
}

 函数关系--重载

重载关系 
-->同一作用域内,函数名相同,参数表不同

-->根据实参类型和形参的类型进行匹配,调用最匹配的函数

-->只有同一作用域内的同名函数才涉及重载的关系,不同作用域的同名函数涉及的是隐藏关系。

重载解析
-->完全匹配>常量转换>升级转换>标准转换>自定义转换>省略号匹配
-->函数指针的类型决定其调用的重载函数的版本

 重载关系

代码演示(重载匹配)

//重载关系: 1.同一作用域内 2.函数名相同 3.参数列表不同
//形参表是否相同,与参数名无关,与形参个数, 以及,每一个对应的参数类型有关
#include <iostream>
using namespace std;
void foo(char* c,short s){cout << "1.foo" << endl;
}
void foo(int i,double d){cout << "2.foo" << endl;
}
void foo(const char* c,short s){cout << "3.foo" << endl;
}
void foo(double d,int i){cout << "4.foo" << endl;
}//int foo(double i,int d){} //错误,形参表相同,是否构成重载关系与返回值类型无关
int main(){char* c;short s;foo(c,s);//1const char* cc;//3foo(cc,s);int i;double d;foo(d,i);//4foo(i,d);//2return 0;
}

代码演示(不同作用域下的重载关系) 

//不同作用域的同名函数涉及的是隐藏关系
#include <iostream>
using namespace std;
namespace ns1{void foo(char* c,short s){cout << "1.foo" << endl;}void foo(int i,double d){cout << "2.foo" << endl;}
}
namespace ns2{void foo(const char* c,short s){cout << "3.foo" << endl;}void foo(double d,int i){cout << "4.foo" << endl;}
}int main(){using namespace ns1;//ns1中foo出现在可见表中using ns2::foo;//ns2中foo出现在定义表中char* c;short s;foo(c,s);//3return 0;
}

重载解析

代码演示(重载解析优先级)

//重载解析优先级
#include<iostream>
using namespace std;void foo(char* c, short s){  //完全匹配 _Z3fooPcscout << "1.foo" << endl;
}
void foo(const char*, short s){  //常量转换 _Z3fooPKcscout << "2.foo" << endl;
}
void foo(char* c, int s){cout << "3.foo" << endl;  //升级转换 _Z3fooPci
}
void foo(char* c, char s){    //标准转换 _Z3fooPcccout << "4.foo" << endl;
}
void foo(...){  //省略匹配  _Z3foozcout << "5.foo" << endl;
}int main(){char* c;short s;foo(c,s);//普通方式调用,由实参和形参的匹配度来决定调用哪个foo函数void(*pfunc)(const char* c,short s) = foo;//_Z3fooPKcspfunc(c,s);//函数指针方式调用,由函数指针本身的类型决定调用哪个foo函数return 0;
}

重载的本质--“换名机制”

Z  --表示自定函数系统默认前缀

P --表示指针

c --char类型

s --short类型

K --const类型

z --表示可变长参数

 屏蔽C++“换名机制”--extern “C” 

        通过extern “C”可以要求C++编译器按照C方式编译函数,即不做换名

原函数
  int sum(int a,int b){return a + b;}int sub(int a, int b){return a - b;}
 查看符号表
tern$vi cal.cpp
11_extern$g++ -c cal.cpp
11_extern$ls
a.out  cal.cpp  cal.o  libcal.a  main.c  main.o
11_extern$ar -r libcal.a cal.o
11_extern$nm libcal.acal.o:
0000000000000014 T _Z3subii
0000000000000000 T _Z3sumii
 使用extern ”C“
extern "C"{int sum(int a,int b){return a + b;}int sub(int a, int b){return a - b;}
}
 查看符号表
11_extern$g++ -c cal.cpp 
11_extern$ls
a.out  cal.cpp  cal.o  main.c  main.o
11_extern$ar -r libcal.a cal.o
ar: 正在创建 libcal.a
11_extern$ls
a.out  cal.cpp  cal.o  libcal.a  main.c  main.o
11_extern$nm libcal.acal.o:
0000000000000014 T sub
0000000000000000 T sum
11_extern$

缺省参数

1.    可以为函数的形参指定缺省(默认)值,当调用该函数时若未指定实参,则使用形参的缺省(默认)值。
2.    如果函数的某一个形参具有缺省(默认)值,那么该形参后面的所有形参必须都具有缺省(默认)值
3.    尽量避免因为使用缺省参数而导致重载匹配歧义
4.    函数形参的缺省(默认)值只能在函数声明中指定

 

//缺省(默认)参数:带默认值的形参
//默认值不是初始值
#include<iostream>
using namespace std;
void foo(int a, double b=3.14, float c=2.0, short d=1, char e = 'A');
void foo(int a){
}
void foo(int a, double b, float c, short d, char e) {// 函数实现cout << "e = " << e << endl;
}
int main(){foo(1,2,3.0,4);foo(1,2,3.0,4,'B');//foo(10);//造成重载匹配歧义return 0;
}

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

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

相关文章

Linux系统ubuntu20.04 无人机PX4 开发环境搭建(失败率很低)

PX4固件下载 PX4的源码处于GitHub&#xff0c;因为众所周知的原因git clone经常失败&#xff0c;此处从Gitee获取PX4源码和依赖模块。 git clone https://gitee.com/voima/PX4-Autopilot.git 正克隆到 ‘PX4-Autopilot’… remote: Enumerating objects: 454209, done. remot…

Apache CloudStack Official Document 翻译节选(十二)

快速部署一朵 Apache CloudStack 云 &#xff08;一&#xff09; 部署前的准备工作 Apache CloudStack快速部署指南 我们究竟在构建什么&#xff1f; 构建IAAS云是一件很复杂的事项&#xff0c;根据相关定义&#xff0c;构建IAAS云的可选项有很多。这些纷繁复杂的概念通常给…

WLAN原理实验简述——AP上线

一、需求&#xff1a; AP通过AC上线。 AC通过控制VLAN管理AP,创建VLAN100和放行。 AP同AC建立CAPWAP关系。 二、实验拓扑图&#xff1a; 三、实验步骤&#xff1a; LSW1: sys Enter system view, return user view with CtrlZ. [Huawei]Sysname lsw1 [lsw1]undo info enable I…

扩散模型(Diffusion Model)

扩散模型&#xff08;diffusion model&#xff09;是一种运用了物理热力学扩散思想的生成模型。扩散模型有很多不同的变形&#xff0c;本文主要介绍最知名的去噪扩散概率模型&#xff08;Denoising Diffusion Probabilistic Model&#xff0c;DDPM&#xff09;。如今比较成功的…

Notepad++回车不自动补全

问题 使用Notepad时&#xff0c;按回车经常自动补全&#xff0c;但我们希望回车进行换行&#xff0c;而不是自动补全&#xff0c;而且自动补全使用Tab进行补全足够了。下文介绍设置方法。 设置方法 打开Notepad&#xff0c;进入设置 - 首选项 - 自动完成&#xff0c;在插入选…

Windows上MSYS2的安装和使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、下载二、安装三、使用1.打开命令行2.搜索软件3.安装软件4.卸载软件5.更新环境6.其他四、MSYS2和Cygwin的差别总结前言 MSYS2这个工具我是越用越喜欢,很多东西放在Linux上如鱼得水但是放在…

禁止文件外发 | 如何禁止员工外发文件?严守企业机密,禁止员工外发敏感文件!

近期&#xff0c;我们注意到一些敏感项目资料有外泄的风险&#xff0c;这对公司的核心竞争力构成了严重威胁&#xff01; 我们必须立即采取行动&#xff0c;严守企业机密&#xff0c;确保每一份文件都安全无虞。 从今天起&#xff0c;我们要全面升级信息安全措施&#xff0c;…

2024世界机器人大会盛大开幕,卓翼飞思携无人智能领域产品集中亮相 !

开放创新 聚享未来&#xff01;万众瞩目的2024世界机器人大会暨博览会于8月21日在北京亦创国际会展中心盛大开幕。大会聚焦机器人技术与产业前沿趋势&#xff0c;展示机器人创新应用赋能千行百业的多元场景&#xff0c;全球顶尖的机器人科学家、行业领袖、创新精英汇聚一堂&…

React学习day04-useEffect、自定义Hook函数

11、useEffect&#xff08;一个React Hook函数&#xff09; &#xff08;1&#xff09;作用&#xff1a;用于在React组件中创建不是由事件引起而是由渲染本身引起的操作&#xff0c;比如发送AJAX请求&#xff0c;更改DOM等&#xff08;即&#xff1a;视图渲染完后会触发一些事…

前端开发,太难啦!

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/#1 《黑神话&#xff1a;悟空》作为一款国产3A游戏&#xff0c;其前端开发的游戏界面和交互设计复杂度极高&#xff0c;这要求开发团队与设计师之间进行紧密合作&#xf…

嵌入式Qt移植之tslib部署到Busybox根文件-思维导图-学习笔记-基于正点原子阿尔法开发板

嵌入式Qt移植之tslib部署到Busybox根文件 烧写Busybox根文件系统到开发板 准备好一个固化系统 以TF卡为例子 TF 卡用读卡器插到 Ubuntu 虚拟机 会出现两个分区 boot分区是存放内核和设备树这些 rootfs分区是存放文件系统的 eMMC、NADA FLASH或者其他方式挂载也可&#xf…

中国严肃游戏开发的最佳实践

严肃游戏产业在中国迅速发展&#xff0c;将娱乐与教育、培训和宣传活动融为一体。旨在实现特定学习成果或行为改变的严肃游戏在从企业培训到医疗保健和教育的各个领域越来越受欢迎。然而&#xff0c;为中国市场开发成功的严肃游戏需要深入了解当地文化、用户偏好和技术趋势。以…

[000-01-001].第04节:Shell中的内置命令

5、Shell内置命令&#xff1a;alias设置别名 目标 1.理解内置命令的含义 2.能够使用alias内置命令进行给命令定义别名 内置命令介绍 Shell 内置命令&#xff0c;就是由 Bash Shell 自身提供的命令&#xff0c;而不是文件系统中的可执行脚本文件。 使用type 来确定一个命令…

恶意代码防范技术原理

恶意代码概述 定义与分类 恶意代码&#xff1a;指违背目标安全策略的程序代码&#xff0c;会造成目标系统信息泄露、资源滥用&#xff0c;破坏系统的完整性及可用性。 传播途径&#xff1a;经过存储介质或网络进行传播&#xff0c;在计算机系统之间传播&#xff0c;未经授权…

【Word与WPS如何冻结首行首列及窗口】

1.Word如何冻结首行首列及窗口 microsoft word 中锁定表头是一项实用的功能&#xff0c;可让您在滚动文档时保持表头可见。这在处理大型文档或包含大量数据的表格时非常有用。php小编柚子将为您详细介绍 word 锁定表头位置的方法&#xff0c;帮助您轻松掌握这项实用技巧。 1.…

认知杂谈43

今天分享 有人说的一段争议性的话 I I 年轻&#xff1a;潜力如海&#xff0c;挑战重重&#xff0c;绝非轻易挥霍的资本 I 咱都觉得年轻好像一张白纸&#xff0c;能在上面画出精彩人生呢。可实际上&#xff0c;年轻可不是啥简单的好事儿&#xff0c;它更像是个宝库&#xff0…

x264 编码器 AArch64汇编系列:DCT 变换相关汇编函数

DCT变换 在x264_dct_init函数中初始化具体的 dct 实现函数。 4x4 块DCT 变换 c 语言版本实现 4x4DCT 变换函数:sub4x4_dct。pixel_sub_wxh 函数: 这个函数的作用是从两个像素块中减去一个像素块,得到差分值,这些差分值将用于DCT变换。参数: diff:指向存储结果差分值的数组…

OHIF Viewers 项目介绍

项目结构 项目架构 │ ├── extensions │ ├── default # 默认功能 │ ├── cornerstone # 使用 Cornerstonejs 处理 2D/3D 图像 │ ├── cornerstone-dicom-sr # 结构化报告 (DICOM SR) │ ├── measurement-tracking # 测量追…

FTP服务器(服务名vsftpd,端口tcp/20和tcp/21)

目录 前言 配置文件 FTP服务器的配置 FTP服务的下载 配置防火墙 编辑配置文件 常用字段&#xff1a; 常用字段&#xff08;匿名用户&#xff09;&#xff1a; 常用字段&#xff08;系统用户&#xff09;&#xff1a; 指定系统用户访问&#xff1a; 编辑名单/etc/vsf…

leetcode_001_两数之和解析

两数之和解析 题目: 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。你可以按任意顺序…