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

ops/2024/10/18 22:32:21/

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);//     successreturn 0;
}

在这里插入图片描述

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

//C
#include <stdio.h>void func()
{
}int main(int argc, char *argv[])
{func();//OKfunc(2, 3);//OKreturn 0;
}
//cpp#include <stdio.h>void func(int =0, int = 0)
{
}int main(int argc, char *argv[])
{func();//OKfunc(2, 3);//OKreturn 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));//3printf("%d\n", func(4, 5));//9printf("%d\n", func("D.T.Software"));//12return 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 ambiguousreturn 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.cppE:\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.objFile Type: COFF OBJECTCOFF SYMBOL TABLE
000 00AB9D1B ABS    notype       Static       | @comp.id
001 00000001 ABS    notype       Static       | @feat.00
002 00000000 SECT1  notype       Static       | .drectveSection length   30, #relocs    0, #linenums    0, checksum        0
004 00000000 SECT2  notype       Static       | .debug$SSection length  E74, #relocs   13, #linenums    0, checksum        0
006 00000000 SECT3  notype       Static       | .rdataSection 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       | .textSection 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$TMZSection 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$IMZSection 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$TSection length   6C, #relocs    0, #linenums    0, checksum        0String Table Size = 0x8A bytesSummaryE74 .debug$S6C .debug$T30 .drectve8 .rdata4 .rtc$IMZ4 .rtc$TMZ68 .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.cppE:\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.oE:\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 statusE:\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 constantextern "C"{^~~

在这里插入图片描述

优化代码

#include <stdio.h>#ifdef __cplusplus
extern "C" {
#endif#include "add.h"#ifdef __cplusplus
}
#endifint main()
{int c = add(1, 2);printf("c = %d\n", c);return 0;
}

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

小结

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


http://www.ppmy.cn/ops/36875.html

相关文章

systemctl开启自动启动特定docker服务

列出所有服务和状态 systemctl list-unit-files --typeservice | grep enabled开机启动docker容器 1.创建Docker启动脚本&#xff1a; 创建一个启动Docker容器的脚本&#xff0c;该脚本可以将Docker服务启动&#xff0c;并启动需要的特定容器。名为start_docker_containers.…

Go语言的切片(slice)和数组(array)有什么不同?

文章目录 数组&#xff08;Array&#xff09;示例代码数组的缺点 切片&#xff08;Slice&#xff09;示例代码切片的优点原因和解决方案 总结 在Go语言中&#xff0c;数组和切片&#xff08;slice&#xff09;都是用来存储一系列相同类型数据的集合&#xff0c;但它们之间存在一…

18、ESP32 ESP-NOW 点对点通信

ESP-NOW 是乐鑫自主研发的无连接通信协议&#xff0c;具有短数据包传输功能。该协议使多个设备能够以简单的方式相互通信。 ESP-NOW 功能 ESP-NOW 支持以下功能&#xff1a; 加密和未加密的单播通信;混合加密和未加密的对等设备;最多可携带 250 字节 的有效载荷;发送回调功能…

OceanBase 分布式数据库【信创/国产化】- OceanBase 配置项和系统变量概述

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase 配置项和系统变量概述前言OceanBase 数据更新架构OceanBase 配置项和系统变量概述配置项配置项分类配置项查询系统变量系统变量分类系统变量查询配置项与系统变量的区分OceanBase 分布式数据库…

刷题之子序列中的 k 种字母

子序列中的 k 种字母 https://kamacoder.com/problempage.php?pid1028 #include<iostream> #include<string> #include<vector> #include<cmath> using namespace std; #define mod 1000000007int main() {int n0;int k0;cin>>n>>k;stri…

五种IO模型

在《Unix网络编程》一书中提到了五种IO模型&#xff0c;分别是&#xff1a;阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。 下面就分别来介绍一下这5种IO模型的异同。 1.阻塞IO模型&#xff1a;当用户调用阻塞函数时&#xff0c;内核会监测有无数据就绪&#xff0c;有…

贪吃蛇大作战(C语言--实战项目)

朋友们&#xff01;好久不见。经过一段时间的沉淀&#xff0c;我这篇文章来和大家分享贪吃蛇大作战这个游戏是怎么实现的。 &#xff08;一&#xff09;.贪吃蛇背景了解及效果展示 首先相信贪吃蛇游戏绝对称的上是我们00后的童年&#xff0c;不仅是贪吃蛇还有俄罗斯⽅块&…

Unity C#的底层原理概述

文章目录 前言IL与IL2CPP总结 前言 看到底层二字&#xff0c;会感到很高深&#xff0c;好似下一秒就要踏入深渊。实际上&#xff0c;对于C#底层的理解非常简单&#xff0c;比冒泡排序这种基础算法还要简单。 底层的两种机制&#xff1a;Mono和IL2CPP。 IL2CPP其中的"2&qu…