C++深度解析教程笔记4

news2024/11/26 16:34:06

C++深度解析教程笔记4

  • 第7课 - 函数参数的扩展
    • 实验-默认参数
    • 实验-从右提供的默认参数
    • 实验-默认值与占位参数结合
    • 小结
  • 第8课 - 函数重载分析(上)
    • 实验-函数重载
    • 实验-有歧义的重载
    • 实验-重载函数是同一函数吗
      • 查看vs2010的obj文件的符号表
    • 小结
  • 第9课 - 函数重载分析(下)
    • 实验-重载与指针
    • 实验-Cpp调用C函数
      • 生成o文件,cpp调用
      • 增加extern "C"{}
      • C编译器不认识 extern "C"
      • 优化代码
    • 实验-extern "C"内部不能存在重载
      • 函数重载在符号表里是不同的标识
      • extern “C”内部有重载,报错
    • 小结

本文学习自狄泰软件学院 唐佐林老师的 C++深度解析教程,图片全部来源于课程PPT,仅用于个人学习记录

第7课 - 函数参数的扩展

在这里插入图片描述
在这里插入图片描述

实验-默认参数

#include <stdio.h>

int mul(int x = 0);

int main(int argc, char *argv[])
{
    printf("%d\n", mul());
    printf("%d\n", mul(-1));
    printf("%d\n", mul(2));
    
    return 0;
}

int mul(int x)
{
    return x * x;
}
/*
output: 
0
1
4

*/

在这里插入图片描述

实验-从右提供的默认参数

#include <stdio.h>

int add(int x, int y = 0, int z = 0);

int main(int argc, char *argv[])
{
    printf("%d\n", add(1));
    printf("%d\n", add(1, 2));
    printf("%d\n", add(1, 2, 3));
    
    return 0;
}

int add(int x, int y, int z)
{
    return x + y + z;
}
/*
1
3
6

*/

在这里插入图片描述

//C代码
#include <stdio.h>
//void fun()//case1
void fun(void)//case2
{
}

int main(int argc, char *argv[])
{
   //fun(1, 2);//case1编译通过了
   fun(1, 2);//case2   error: too many arguments to function 'fun'
    
    return 0;
}
//cpp
#include <stdio.h>
void fun()//case1
//void fun(void)//case2
{
}

int main(int argc, char *argv[])
{
   fun(1, 2);//case1      error: too many arguments to function 'fun'
   //fun(1, 2);//case2   error: too many arguments to function 'fun'
    
    return 0;
}

#include <stdio.h>
void fun(int,int)//添加占位参数

{
}

int main(int argc, char *argv[])
{
   fun(1, 2);//     success
 
    return 0;
}

在这里插入图片描述

实验-默认值与占位参数结合

//C
#include <stdio.h>

void func()
{
}

int main(int argc, char *argv[])
{
     func();//OK
    func(2, 3);//OK
    
    return 0;
}
//cpp

#include <stdio.h>

void func(int =0, int = 0)
{
}

int main(int argc, char *argv[])
{
     func();//OK
    func(2, 3);//OK
    
    return 0;
}

小结

在这里插入图片描述

第8课 - 函数重载分析(上)

在这里插入图片描述

实验-函数重载

#include <stdio.h>
#include <string.h>

int func(int x)
{
    return x;
}

int func(int a, int b)
{
    return a + b;
}

int func(const char* s)
{
    return strlen(s);
}


int main(int argc, char *argv[])
{
    printf("%d\n", func(3));//3
    printf("%d\n", func(4, 5));//9
    printf("%d\n", func("D.T.Software"));//12
    
    return 0;
}

在这里插入图片描述
在这里插入图片描述

实验-有歧义的重载

#include <stdio.h>

int func(int a, int b, int c = 0)
{
    return a * b * c;
}

int func(int a, int b)
{
    return a + b;
}


int main(int argc, char *argv[])
{
    int c = func(1, 2);//error: call of overloaded 'func(int, int)' is ambiguous
    
    return 0;
}

在这里插入图片描述
在这里插入图片描述

实验-重载函数是同一函数吗

#include <stdio.h>

int add(int a, int b)  // int(int, int)
{
    return a + b;
}

int add(int a, int b, int c) // int(int, int, int)
{
    return a + b + c;
}

int main()
{
    printf("%p\n", (int(*)(int, int))add);        

    printf("%p\n", (int(*)(int, int, int))add);   

    return 0;
}
//cmd
E:\test>g++ 8-3.cpp

E:\test>a
0000000000401550
0000000000401564

查看vs2010的obj文件的符号表

在这里插入图片描述

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>dumpbin /symbols "D:\Users\Documents\Visual Studio 2010\Projects\test\helloworld\Debug\test.obj"
Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file D:\Users\Documents\Visual Studio 2010\Projects\test\helloworld\Debug\test.obj

File Type: COFF OBJECT

COFF SYMBOL TABLE
000 00AB9D1B ABS    notype       Static       | @comp.id
001 00000001 ABS    notype       Static       | @feat.00
002 00000000 SECT1  notype       Static       | .drectve
    Section length   30, #relocs    0, #linenums    0, checksum        0
004 00000000 SECT2  notype       Static       | .debug$S
    Section length  E74, #relocs   13, #linenums    0, checksum        0
006 00000000 SECT3  notype       Static       | .rdata
    Section length    8, #relocs    0, #linenums    0, checksum C59740A9
008 00000000 SECT3  notype       Static       | $SG3864
009 00000004 SECT3  notype       Static       | $SG3869
00A 00000000 SECT4  notype       Static       | .text
    Section length   68, #relocs    9, #linenums    0, checksum F4126B23
00C 00000000 SECT4  notype ()    External     | ?add@@YAHHH@Z (int __cdecl add(int,int))
00D 00000000 SECT5  notype       Static       | .rtc$TMZ
    Section length    4, #relocs    1, #linenums    0, checksum        0, selection    2 (pick any)
00F 00000000 SECT5  notype       Static       | __RTC_Shutdown.rtc$TMZ
010 00000000 UNDEF  notype ()    External     | __RTC_Shutdown
011 00000000 SECT6  notype       Static       | .rtc$IMZ
    Section length    4, #relocs    1, #linenums    0, checksum        0, selection    2 (pick any)
013 00000000 SECT6  notype       Static       | __RTC_InitBase.rtc$IMZ
014 00000000 UNDEF  notype ()    External     | __RTC_InitBase
015 00000010 SECT4  notype ()    External     | ?add@@YAHHHH@Z (int __cdecl add(int,int,int))
016 00000020 SECT4  notype ()    External     | _main
017 00000000 UNDEF  notype       External     | __imp__printf
018 00000000 UNDEF  notype ()    External     | __RTC_CheckEsp
019 00000000 SECT7  notype       Static       | .debug$T
    Section length   6C, #relocs    0, #linenums    0, checksum        0

String Table Size = 0x8A bytes

  Summary

         E74 .debug$S
          6C .debug$T
          30 .drectve
           8 .rdata
           4 .rtc$IMZ
           4 .rtc$TMZ
          68 .text

//符号表
//  00C 00000000 SECT4  notype ()    External     | ?add@@YAHHH@Z (int __cdecl add(int,int))
//  015 00000010 SECT4  notype ()    External     | ?add@@YAHHHH@Z (int __cdecl add(int,int,int))

小结

在这里插入图片描述

第9课 - 函数重载分析(下)

在这里插入图片描述
在这里插入图片描述

实验-重载与指针

#include <stdio.h>
#include <string.h>

int func(int x)//case1
{
    return x;
}

int func(int a, int b)
{
    return a + b;
}

int func(const char* s)
{
    return strlen(s);
}

typedef int(*PFUNC)(int a);//只跟case1的类型一致


int main(int argc, char *argv[])
{
    int c = 0;

    PFUNC p = func;
        
    c = p(1);   
    
    printf("c = %d\n", c);

    return 0;
}
/*
E:\test>g++ 9-1.cpp

E:\test>a
c = 1
*/

在这里插入图片描述
在这里插入图片描述

实验-Cpp调用C函数

//add.h
int add(int a, int b);
//add.c
#include "add.h"
int add(int a, int b)
{
    return a + b;
}
//main0.cpp
#include <stdio.h>
#include "add.h"

int main()
{
    int c = add(1, 2);
    
    printf("c = %d\n", c);
    
    return 0;
}

生成o文件,cpp调用

//cmd
E:\test\9-2>gcc -c add.c -o add.o

E:\test\9-2>g++ main0.cpp add.o
C:\Users\cyz1994\AppData\Local\Temp\ccaFXqUM.o:main0.cpp:(.text+0x18): undefined reference to `add(int, int)'
collect2.exe: error: ld returned 1 exit status

E:\test\9-2>nm add.o     //查看符号表
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata$zzz
0000000000000000 t .text
0000000000000000 r .xdata
0000000000000000 T add

增加extern “C”{}

在这里插入图片描述

C编译器不认识 extern “C”

E:\test\9-2>gcc main0.c
main0.c:4:8: error: expected identifier or '(' before string constant
 extern "C"{
        ^~~

在这里插入图片描述

优化代码

#include <stdio.h>


#ifdef __cplusplus
extern "C" {
#endif

#include "add.h"

#ifdef __cplusplus
}
#endif


int main()
{
    int c = add(1, 2);
    
    printf("c = %d\n", c);
    
    return 0;
}

在这里插入图片描述

实验-extern "C"内部不能存在重载

函数重载在符号表里是不同的标识

在这里插入图片描述

extern “C”内部有重载,报错

在这里插入图片描述

小结

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

How a window is added to windowmanager when you start an activity

finally call mWindowSession.addToDisplayAsUser how surfacecontrol is showed when you start an activity

Redis教程——事务

在上篇文章我们学习了Redis教程——持久化&#xff08;AOF&#xff09;&#xff0c;这篇文章我们学习Redis教程——事务。 Redis事务 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&a…

ROS1快速入门学习笔记 - 014launch启动文件的使用方法

一、定义 Launch文件&#xff1a;通过XML文件实现多节点的配置和启动&#xff08;可自动启动ROSMaster&#xff09; 二、常用语法 1. 根标签 <launch> - launch文件中的根元素采用<launch>标签定义 <launch>表示开始&#xff1b;<launch>表示结束&…

搜狗输入法自动切换双拼方案

解决方法&#xff0c; 安装 13.2.0 &#xff0c; to be verified SGSRv13206899_搜狗输入法13.2.0 需要关闭自动升级

某米社区请求data类型multipart_form-data分析

随笔记录 之前未曾遇到请求的Content-Type:multipart/form-data; boundary=----WebKitFormBoundary9Fxpi3Dvlnhm3MKq,今天就简单是根据目标网站进行分析下,目标站点是:aHR0cHM6Ly93ZWIudmlwLm1pdWkuY29tL3BhZ2UvaW5mby9taW8vbWlvL3BjU2VhcmNoP2Zyb21QYXRobmFtZT1taW9Cb2FyZ…

STL中常见的算法及其应用(一)

总述: 一、常见的遍历算法 1、for_each//遍历容器 函数原型: for_each(iterator beg, iterator end, _func); beg:开始迭代器; end:结束迭代器; _func:函数或者函数对象; 总结:for_each函数在STL中十分重要,需要熟练掌握 示例: std::for_each 是 C++ 标准…

如何利用ChatGPT撰写满分文案:技巧与实例解析

在当今社会&#xff0c;随着企业越来越重视宣传推广&#xff0c;文案写作已成为关键的营销手段之一。同时&#xff0c;人工智能的快速发展为文案创作提供了新的工具和方法。例如&#xff0c;ChatGPT这种基于自然语言处理的模型&#xff0c;在协助撰写多种文案方面展现出了极大的…

A4的PDF按A3打印

先用办公软件打开&#xff0c;比如WPS。 选择打印-属性。 纸张选A3&#xff0c;如果是双面打印&#xff0c;选短边装订&#xff0c;然后在版面-页面排版-每张页数&#xff08;N合1&#xff09;选2。 不同打印机的具体配置可能不一样&#xff0c;但大体都是这个套路。

【画图】读取无人机IMU数据并打印成log用matlab分析

一、修改IMU频率 原来的imu没有加速度信息&#xff0c;查看加速度信息的指令为&#xff1a; rostopic echo /mavros/imu/data 修改imu频率&#xff0c;分别修改的是 原始IMU数据话题 /mavros/imu/data_raw。飞控计算过后的IMU数据 /mavros/imu/data rosrun mavros mavcmd l…

算法提高之方格取数

算法提高之方格取数 核心思想&#xff1a;数字三角形模型 考虑同时走两条路 用f[i1][j1][i2][j2]表示两条路取值 因为两条路步数一定相同 即i1j1 i2j2 设为k 则f[k][i1][i2]即可表示两条路 k n*2 dp方法如图 #include <iostream>#include <cstring>#inclu…

【系统架构师】-选择题(十)

1、某计算机系统页面大小为2K&#xff0c;进程P1的页面变换表如下图所示&#xff0c;若P1要访问数据的逻辑地址为十六进制1B1AH&#xff0c;那么该逻辑地址经过变换后&#xff0c;其对应的物理地址应为十六进制 &#xff08;231AH&#xff09; 。 四位换一位 逻辑地址1B1AH对应…

基于SpringBoot实现各省距离Excel导出实战

目录 前言 一、列表及图表信息展示 1、数据过滤调整 2、信息列表及图表展示 3、Excel写入 二、界面可视化 1、Echarts图表和列表展示 2、城市详情和下载功能设计 三、成果展示 1、图表展示 2、部分城市数据分析 总结 前言 今天是五一黄金周假期第二天&#xff0c;不知…

JavaScript任务执行模式:同步与异步的奥秘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

如何在postman上提交文件格式的数据

如何在postman上提交文件格式的数据 今天在写一个文件上传的功能接口时&#xff0c;想用postman进行提交&#xff0c;花了些时间才找到在postman提交文件格式的数据。记录一下吧&#xff01; 1.打开postman&#xff0c;选择POST提交方式&#xff0c;然后在Params那一行的Head…

「C/C++ 01」volatile关键字 和 修改const修饰的变量

目录 一、修改const修饰的局部变量 二、无法修改const修饰的全局变量 三、volatile关键字 面试题】 一、修改const修饰的局部变量 可以通过指针和强转来修改const修饰的局部变量。 #include <iostream> using namespace std;int main(void) {const int a 1;int* pa (in…

Android BINDER是干嘛的?

1.系统架构 2.binder 源码位置&#xff1a; 与LINUX传统IPC对比

【Redis深度专题】「核心技术提升」高级特性之Lua脚本执行机制的实现与探究

高级特性之Lua脚本执行机制的实现与探究 内容梗概什么是LuaLua的应用Lua的特点Redis引入Lua脚本Redis中引入Lua的原因Lua脚本的原子处理能力Lua减少网络开销Lua脚本复用与提高效率 Redis中Lua的常用命令指令&#xff1a;EVAL指令格式案例介绍Redis函数&#xff1a;call和pcallr…

[NSSCTF]prize_p1

前言 之前做了p5 才知道还有p1到p4 遂来做一下 顺便复习一下反序列化 prize_p1 <META http-equiv"Content-Type" content"text/html; charsetutf-8" /><?phphighlight_file(__FILE__);class getflag{function __destruct(){echo getenv(&qu…

能源监控新方案:IEC104转MQTT网关在新能源发电中的应用

需求背景 近些年&#xff0c;我国新能源产业快速发展&#xff0c;光伏、风电等新能源项目高速增长&#xff0c;新能源发电已经成为国家能源结构的重要组成部分。 打造数字化、智能化、信息化的电力物联网系统&#xff0c;实现光伏风电等新能源发电站的远程监控、远程维护是新能…

企业气候风险披露、报表词频、文本分析数据集合(2007-2022年)

01、数据介绍 企业气候风险披露是指企业通过一定的方式&#xff0c;将气候变化对其影响、自身采取的应对措施等信息披露出来。这有助于投资者更准确地评估企业价值&#xff0c;发现投资机会&#xff0c;规避投资风险。解企业在气候风险方面的关注度和披露情况。 可以帮助利益…