C++语法基础(二)

news2024/9/27 15:35:26

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);//1
    const char* cc;//3
    foo(cc,s);
    int i;double d;
    foo(d,i);//4
    foo(i,d);//2
    return 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);//3
    return 0;
}

重载解析

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

//重载解析优先级
#include<iostream>
using namespace std;

void foo(char* c, short s){  //完全匹配 _Z3fooPcs
    cout << "1.foo" << endl;
}
void foo(const char*, short s){  //常量转换 _Z3fooPKcs
    cout << "2.foo" << endl;
}
void foo(char* c, int s){
    cout << "3.foo" << endl;  //升级转换 _Z3fooPci
}
void foo(char* c, char s){    //标准转换 _Z3fooPcc
    cout << "4.foo" << endl;
}
void foo(...){  //省略匹配  _Z3fooz
    cout << "5.foo" << endl;
}

int main(){
    char* c;
    short s;
    foo(c,s);//普通方式调用,由实参和形参的匹配度来决定调用哪个foo函数
    void(*pfunc)(const char* c,short s) = foo;//_Z3fooPKcs
    pfunc(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.a

cal.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.a

cal.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.coloradmin.cn/o/2088717.html

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

相关文章

聊聊Promise,catch和then的关系,rejected状态如何在then链中”透传“直到被处理

Promise在前端开发中用的很多了&#xff0c;感觉好像很熟了&#xff0c;但真的有些细节追究起来好像又有点是是而非。 今天聊聊Promise中的then和catch&#xff0c;以下面这个代码片段为例&#xff0c;如果能正确说出打印的内容&#xff0c;说明已经掌握了&#xff0c;后面的内…

Linux教程六:linux系统目录介绍

一、Linux系统目录介绍 1、关于目录的命令行讲解 需要确保自己使用了root账号登陆 cd / # 进入根目录 cd 目录路径 #进入到指定目录中去 #路径有绝对路径和相对路径&#xff0c;在Linux中&#xff0c;绝对路径以/开头ll #列举当前目录下所有文件和文件夹 &#xff08;ls -l…

活动报道 | 盘古信息亮相东莞中小数转供需对接会(滨海片区),深度剖析典型案例

为积极响应国家关于加快中小企业数字化转型的号召&#xff0c;推动东莞市中小企业数字化进程&#xff0c;8月29日&#xff0c;由东莞市工业和信息化局主办&#xff0c;长安镇经济发展局承办&#xff0c;东莞市软件行业协会协办的东莞市中小企业数字化转型城市试点供需对接会&am…

Vue3中的defineExpose的认识

文章目录 defineExpose子组件父组件&#xff1a;总结&#xff1a; defineExpose 使用 <script setup> 的组件是默认关闭的——即通过模板引用或者 $parent 链获取到的组件的公开实例&#xff0c;** 不会 **暴露任何在 <script setup> 中声明的绑定。 可以通过 def…

BH1750光照传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.工作原理&#xff1a;结构框图 三、程序设计 main.c文件 bh1750.h文件 bh1750.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 BH1750是一款数字型光照强度传感器&#xff0c;能够获取周围环境的光照强度。内置16bitAD转…

通帆科技“液氢微型发电站”:点亮氢能产业新征程

新质生产力的蓬勃发展正以磅礴之力推动产业的转型升级&#xff0c;氢能产业作为新质生产力的璀璨之星&#xff0c;成为新能源领域的关键增长极。 8 月 28 日&#xff0c;通帆新能源科技&#xff08;山东&#xff09;有限公司精心研发的 500kw “液氢微型发电站”产品成功下线交…

【C/C++】C语言中的内存分布

在C语言中&#xff0c;内存分布主要可以分为以下几个区域&#xff1a; 栈&#xff08;Stack&#xff09;&#xff1a;由编译器自动分配和释放&#xff0c;存放函数的参数值、局部变量的值等。 堆&#xff08;Heap&#xff09;&#xff1a;一般由程序员分配和释放&#xff0c;若…

电容应用原理

电容器是电子电路中不可或缺的元件&#xff0c;其在电路中承担的任务繁多&#xff0c;既可以用作储能元件&#xff0c;也能用于滤波、旁路和去耦。 电容的基本原理 电容的基本工作原理可以理解为电荷的存储和释放。电容器由两块金属板和夹在中间的绝缘介质构成&#xff0c;当…

Unity 中使用SQLite数据库

文章目录 0.参考文章1.Presentation —— 介绍2.&#xff08;SQLite4Unity3d&#xff09;Unity中直接使用SQLite的插件3.创建数据库4.创建表5.Navicat Premium&#xff08;数据库可视化&#xff09;6.增删改查6.1 增6.2 删6.3 改6.4 查 0.参考文章 https://blog.csdn.net/Chin…

结合系统架构设计的非功能性需求开发一套文化用品商城系统

案例 阅读以下关于软件系统设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某文化产业集团委托软件公司开发一套文化用品商城系统&#xff0c;业务涉及文化用品销售、定制、竞拍和点评等板块&#xff0c;以提升商城的信息化建设水平。该软件公司组织项目组完…

2024最新盘点:这12款plm项目管理系统值得推荐!

本文将盘点主流的plm项目管理系统&#xff0c;为企业选型提供参考 。 高效的plm项目管理系统是确保工程顺利进行、按时交付以及控制成本的关键&#xff0c;据美国建筑行业研究院的研究数据表明&#xff0c;实施高效项目管理的建筑企业&#xff0c;能够将项目成本降低 5%-10%。我…

1.7 离散频率

1.7 离散频率 离散时间和采样率 模拟到数字转换器 (ADC) 对连续时间信号进行采样以生成离散时间样本。对于数字信号处理器来说&#xff0c;该信号仅存储在内存中作为一系列数字。因此&#xff0c;采样率 F S F_S FS​ 的知识是数字域中信号处理的关键。 对于时间而言&#…

光敏电阻传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.光敏电阻传感器介绍 2.原理图 三、程序设计 main.c文件 ldr.h文件 ldr.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 光敏电阻器是利用半导体的光电导效应制成的一种电阻值随入射光的强弱而改变的电阻器&#xff0c;又称为光…

计网_整体概念逻辑简单过一遍

1. 简述四层TCP/IP 网络模型 由于 OSI 模型实在太复杂&#xff0c;提出的也只是概念理论上的分层&#xff0c;并没有提供具体的实现方案。 事实上&#xff0c;我们比较常见&#xff0c;也比较实用的是四层模型&#xff0c;即 TCP/IP 网络模型&#xff0c; 1.1 应用层 在四…

萤石云 C++ SDK使用指南

今天继续指南系列&#xff0c;给出了萤石云QtDemo配置使用以及sdk开发中常见问题的指南 SDK下载 一、demo使用配置 1、demo环境配置 Demo 所使用Qt SDK版本&#xff1a;Qt4.8.5 Demo两种开发模式&#xff1a; 下载Qt Creator for Windows&#xff0c;使用Qt Creator作为I…

计算机毕业设计选题推荐-办公管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【方法】如何编辑“只读方式”下的Word文档?

以“只读方式”打开的Word文档&#xff0c;怎样才能正常编辑呢&#xff1f;Word文档有两种“只读方式”&#xff0c;我们分别来看看如何编辑。 方式一&#xff1a;无密码的只读方式 当Word文档设置了无密码的“只读方式”&#xff0c;打开文档后会看到提示“是否以只读方式打开…

设计与实现基于Java的零工市场系统

零工市场&#xff0c;也被称为临时工市场或自由职业市场&#xff0c;为求职者和雇主提供了一个灵活的、按需匹配的工作机会平台。为了满足日益增长的零工经济需求&#xff0c;我们设计并实现了一个基于Java的零工市场系统&#xff0c;该系统具备用户管理、任务发布、任务申请、…

基于Python的音乐推荐系统的设计与实现---附源码92641

摘 要 基于Python大数据技术的音乐推荐系统设计与实现旨在利用大数据处理和分析技术&#xff0c;为用户提供个性化、精准的音乐推荐服务。该系统将结合用户行为数据、音乐特征和大规模数据集&#xff0c;采用机器学习和深度学习算法&#xff0c;实现智能化的音乐推荐功能。 系统…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-21读写I2C接口EEPROM实验

软件版本&#xff1a;VIVADO2021.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台&#xff1a;米联客-MLK-H3-CZ08-7100开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…