C++语法基础(二)

ops/2024/9/18 13:45:29/ 标签: c++, c语言, vim, vscode, 函数的重载, 换名机制

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.ppmy.cn/ops/103274.html

相关文章

【Node】m1 mac 使用 nvm 安装 node v14 报错

author: jayzhen date: 20240826 报错内容 nvm 0.39.3macbook m1pro os14.6.1 v8_compiler/deps/v8/src/compiler/backend/instruction-selector.o.d.raw -c In file included from ../deps/v8/src/compiler/backend/frame-elider.cc:5: In file included from ../deps/v8/…

汇编知识MOV,MRS,MSR,PUSH和POP指令

处理器做得最多的事情就是在处理器内部来回的进行数据传递 1) 将数据从一个寄存器传递到另一个寄存器中 2) 将数据从一个寄存器传递到特殊寄存器&#xff0c;例如CPSR,SPSR寄存器 3) 将立即数传递到寄存器。 数据传输常用的三个指令&#xff1a;MOV,MRS,MSR指令 常用的…

[Algorithm][综合训练][合并k个已排序的链表][dd爱旋转][小红取数]详细讲解

目录 1.合并k个已排序的链表1.题目链接2.算法原理讲解 && 代码实现 2.dd爱旋转1.题目链接2.算法原理详解 && 代码详解 3.小红取数1.题目链接2.算法原理详解 && 代码实现 1.合并k个已排序的链表 1.题目链接 合并k个已排序的链表 2.算法原理讲解 &…

无人机科普,民用用途!!!

在民用领域&#xff0c;无人机凭借其独特的飞行能力和广泛的应用场景&#xff0c;已成为现代科技的重要组成部分。 1. 摄影和摄像 航拍&#xff1a;无人机配备高分辨率相机或摄像机&#xff0c;能够拍摄到独特的空中视角&#xff0c;广泛应用于风景拍摄、建筑摄影、活动录像等…

数据库水平分表方案

数据库分表有很多策略&#xff0c;如下&#xff1a; 数据库分表是处理大型数据库中数据量过大的一种常见策略&#xff0c;它可以提高查询性能、减少锁竞争、降低维护成本等。以下是一些常见的数据库分表方案&#xff1a; 1. **垂直分表&#xff08;Vertical Partitioning&…

随笔(1)将 CSV 文件导入 MySQL 时出现中文乱码问题解决方案

将 CSV 文件导入 MySQL 时出现中文乱码问题解决方案 一、检查 CSV 文件编码 确认 CSV 文件的编码格式。常见的编码有 UTF-8、GBK 等。你可以使用文本编辑器&#xff08;如 Notepad&#xff09;打开 CSV 文件&#xff0c;查看其编码格式。如果编码格式不是 UTF-8&#xff0c;可…

最长回文子串:动态规划推导

最长回文子串&#xff1a;结合图形推导动态规划 题目介绍 本题可以在力扣找到&#xff0c;题号为5。 给你一个字符串 s&#xff0c;找到 s 中最长的 回文子串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a;“aba” 同样是符…

数据爬虫工作中的IP清理频率

在大数据和信息时代&#xff0c;数据爬虫已经成为获取信息的重要手段。然而&#xff0c;频繁的数据抓取往往会引发目标网站的反爬虫机制&#xff0c;导致IP地址被封禁。因此&#xff0c;对于经常进行数据爬虫抓取工作的人来说&#xff0c;合理管理和清理IP地址显得尤为重要。 …

vue nginx部署 配置 解决href = ‘/login路由‘ 跳转404问题

示例场景 <a :hrefthis.repDownloadUrl>下载平台</a><a href"/join" target"_blank">入驻平台</a><a href"/index" target"_blank" class"btn_login" style"color:#fff">nginx部署…

读书笔记:《深入理解Java虚拟机》(5)

垃圾收集器与内存分配策略 二、垃圾收集算法 从如何判定对象消亡的角度出发&#xff0c;垃圾收集算法可以划分为“引用计数式垃圾收集”&#xff08;Reference Counting GC&#xff09;和“追踪式垃圾收集”&#xff08;Tracing GC&#xff09;两大类&#xff0c;这两类也常被…

selenium连接远程chrome浏览器

连接本地浏览器 命令行启动浏览器 chrome.exe --remote-debugging-port9222 --user-data-dir"C:\selenium\ChromeProfile"selenium连接 from selenium import webdriveroptions webdriver.ChromeOptions() options.debugger_address "127.0.0.1:9222" se…

carla unreal engine源码:如何创建radar可视化探测锥

文章目录 前言一、C实现方法1、DrawDebugCone函数2、carla工程修改3、make launch4、探测锥验证 二、蓝图实现方法1、创建并打开蓝图2、打开蓝图事件图表3、绘制蓝图事件4、编译再运行 前言 1、在自动驾驶仿真调试以及测试过程中&#xff0c;我们经常会用到雷达的探测锥&#…

idea付费插件,SequenceDiagram有哪些优点

以下idea付费插件你们都用过哪些呢&#xff1f; SequenceDiagram插件是一种用于绘制时序图的工具。时序图是一种图形化的表示对象之间消息传递顺序的方法。 该插件可以在使用各种编程语言编写代码时&#xff0c;方便地绘制时序图&#xff0c;以帮助开发者更好地理解和描述系统…

Elasticsearch 中,term 查询和 match 查询的区别

文章目录 前言Elasticsearch 中&#xff0c;term 查询和 match 查询的区别1. Term 查询2. Match 查询3. 总结 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都…

【前端面试基础】计算机网络、浏览器、操作系统

计算机网络 一、网络协议与模型 什么是协议&#xff1f; 协议是指计算机系统中完成特定任务所必需的规则和约定&#xff0c;特别是数据传输和交换的规则和约定。OSI和TCP/IP是什么&#xff1f; OSI&#xff08;开放式系统互连参考模型&#xff09;是一种网络架构模型&#xf…

NestJs bull 用法

bull简介 队列 bull bull用法 https://github.com/OptimalBits/bull Bull is currently in maintenance mode, we are only fixing bugs. For new features check BullMQ, a modern rewritten implementation in Typescript. You are still very welcome to use Bull if it…

用宝塔部署项目到阿里云服务器访问不到的问题

今天用宝塔部署项目到阿里云&#xff0c;开始前端部署到了80端口&#xff0c;能正常访问&#xff0c;后端部署到了8081&#xff0c;但是后端接口一直无响应&#xff0c;最后超时。 但是java正常运行 系统防火墙的状态正常&#xff0c;策略也是放行 阿里云安全组也已经配置了 …

Express Auth实战:从用户注册到JWT令牌验证的完整指南

在Web应用开发中&#xff0c;认证&#xff08;Authentication&#xff09;与授权&#xff08;Authorization&#xff09;是确保应用安全性的关键环节。Express作为Node.js的流行框架&#xff0c;提供了灵活而强大的中间件机制&#xff0c;使得实现认证与授权变得相对简单。本文…

坐牢第三十天(c++)

1.作业&#xff1a; 提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream> #include <stdio.h> #include <string> using namespace std; int main(int argc, char const *argv[]) {string st…

培训学校课程管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…