0813,引用,函数重载,内存布局叭叭叭


是我4句话5个ERROR,阿巴阿巴

001_arrpointer.cc

#include <iostream>
using std::cout;
using std::endl;void test(){int a[5]={1,2,3,4,5};int (*p)[5]=&a;cout<<p<<endl;cout<<p+1<<endl;int *pp=(int*)(&a+1);//第二个数组的首地址(*int)[5],强转成int*//变成第二个数组的首元素的地址cout<<*(a+1)<<"  "<<*(pp-1)<<endl;
}int main(void)
{test();return 0;
}

01,引用

reference.cc

#include <iostream>
using std::cout;
using std::endl;void test(){int num=100;int & ref=num;//& 不代表取值符,代表引用符号cout<<ref<<endl;ref=1000000;cout<<ref<<endl;int num2=200;ref=num2;//赋值int *p=&num;cout<<&num<<endl;cout<<&ref<<endl;//底层 cosnt poitercout<<&p<<endl;cout<<&num2<<endl;/* 特殊的常量指针,无法对其进行访问,只能间接访问到指向的对象/地址 */cout<<endl;const int & ref1=num;/* ref1=num2; *//* 不希望通过引用改变其本体,const */
}int main(void)
{test();return 0;
}

swap.cc

#include <iostream>
using std::cout;
using std::endl;void swap(int x,int y){
}void swap1(int *px,int *py){int z=*px;*px=*py;*py=z;
}//int & a=x,int & b=y
void swap2(int & a,int &b){int temp=a;a=b;b=temp;
}int num=100;
int func1(){return num; //执行return 语句的时候会发生copy
}
int & func2(){
//如果某个函数需要让其返回值是某个变量本身
//那么可以在函数返回类型中加上&return num; //no copy 
}
#if 0
int & func(){int num=1;return num;//num被销毁,悬空引用//确保引用绑定的本体的生命周期比函数更长
}
#endif
int & func4(){int *p=new int(10);return *p; //no delete
}void test(){int x=6,y=90;swap2(x,y);cout<<"x="<<x<<"  y="<<y<<endl;swap1(&x,&y);cout<<"x="<<x<<"  y="<<y<<endl;cout<<endl;cout<<&num<<endl;cout<<func1()<<endl; //临时变量cout<<func2()<<endl;  //绑定到num的引用cout<<&func2()<<endl;//对本体进行访问int & ref=func4();cout<<ref<<endl;delete &ref;//回收
}int main(void)
{test();return 0;
}

02,强制转换

typecast.cc           靓仔迷惑

#include <iostream>
#include <stdlib.h>
using std::cout;
using std::endl;void test(){int *p=(int*)malloc(sizeof(int));*p=100;free(p);p=nullptr;int *p1=static_cast<int*>(malloc(sizeof(int)));*p1=100;free(p1);p1=nullptr;cout<<endl;const int num=10;/* int a=const_cast<int>(num); *//* int a=const_cast<int>(10); *///把能const int -->intconst int *pp=&num;int *p2=const_cast<int*>(pp);//作用于 const引用和指向常量的指针*p2=100;cout<<*p2<<endl; //100cout<<num<<endl; //10cout<<p2<<endl;cout<<&num<<endl;}int main(void)
{test();return 0;
}

03,函数重载  04,默认参数

overload.cc

#include <iostream>
using std::cout;
using std::endl;//函数重载
//编译器的名字改变机制将函数的名字改编成了与参数信息相关的名字
int add(int x,int y){cout<<"int+int"<<" \t\t"; return x+y;}
int add(int x,int y,int z){cout<<"int+int+int"<<" \t\t"; return x+y+z;}
double add(double x,double y){cout<<"double+double"<<" \t\t"; return x+y;}
double add(int x,double y){cout<<"int+double"<<" \t\t"; return x+y;}
double add(double x,int y){cout<<"double+int"<<" \t\t"; return x+y;}
/* void  add(int x,double y){cout<<"int+double"<<" "; } *///用C的方式编译函数
//不可以进行函数重载
extern "C"{
int func(int x,int y){cout<<"int+int"<<" "; return x+y;}
/* int func(int x,int y,int z){cout<<"int+int+int"<<" "; return x+y+z;} */
int func01(int x,int y,int z){cout<<"int+int+int"<<" "; return x+y+z;}
}/* void ffunc(int x,int y){ */
/*     cout<<"x="<<x<<"\t\t"; */
/*     cout<<"y="<<y<<endl; */
/* } */
/* void ffunc(int x,int y=6){ */
/*     cout<<"x="<<x<<"\t\t"; */
/*     cout<<"y="<<y<<endl; */
/* }//备胎 */
void ffunc(int x=9090,int y=6){cout<<"x="<<x<<"\t\t";cout<<"y="<<y<<endl;
}//备胎/* void ff(int x=10086,int y); */
void ff(int x,int y=10086);
//实现与声明分离,建议默认值给声明
//顺序默认从右到左int dd(int x,int y,int z=100){cout<<"int+int+int"<<" \t\t"; return x+y+z;}
int dd(int x,int y){cout<<"int+int"<<" \t\t"; return x+y;}
//函数重载+默认值,可能会引发冲突void test(){cout<<add(1,2)<<endl;cout<<add(1,2,3)<<endl;cout<<add(1.5,2.5)<<endl;cout<<add(1,2.5)<<endl;cout<<add(1.3333,2)<<endl;cout<<add(1,2.77)<<endl;//缺省调用ffunc(10,9);ffunc(2);ffunc();ff(10,9);ff(10);cout<<dd(10,10,10)<<endl;/* dd(10,10); */
}void ff(int x,int y){cout<<"x="<<x<<"\t\t";cout<<"y="<<y<<endl;
}//备胎int main(void)
{test();return 0;
}

05,BOOL类型

bool.cc

#include <iostream>
using std::cout;
using std::endl;void test(){int x=true;int y=false;cout<<x<<endl;cout<<y<<endl;bool b1=1;bool b2=100;bool b3=0;bool b4=-1;cout<<b1<<endl;cout<<b2<<endl;cout<<b3<<endl;cout<<b4<<endl;// 1 1 0 1if(b4){cout<<"i love xixi"<<endl;}cout<<sizeof(b4)<<endl;
}int main(void)
{test();return 0;
}

06,INLINE函数

inline.cc   头文件需要声明和定义写一起

#include <iostream>
using std::cout;
using std::endl;//宏定义函数,不会检查,只替换
#define MAX(a,b) (a)>(b)?(a):(b)
#define MIN(a,b) {(a)>(b)?(a):(b)}//内联函数
//建议替换,(可能不采纳)
//更高级的替换,有安全检查机制
inline int max(int x,int y){return x>y?x:y; 
}void test(){/* cout<<MAX(20,10)+20<<endl; *//* cout<<MAX(10,20)+20<<endl; *//* cout<<MIN(20,10)+20<<endl; *//* cout<<MIN(10,20)+20<<endl; *///不是哥们,4句话 5个errorcout<<max(20,10)+20<<endl;cout<<max(10,20)+20<<endl;
}int main(void)
{test();return 0;
}

07,异常处理

catch.cc

#include <iostream>
using std::cout;
using std::endl;double division(double x,double y){if(y==0){throw "0 been division";}else if(x==0){throw 1.1;}return x/y;
}
void test(){try{double x=0,y=100;cout<<division(x,y)<<endl;cout<<"over"<<endl;}catch(const char*){/* cout<<msg<<endl; */cout<<" errr!!!!!"<<endl;}catch(double a){cout<<a<<endl;}cout<<"i love xixi"<<endl;
}int main(void)
{test();return 0;
}

08,内存布局

#include <iostream>
using std::cout;
using std::endl;const int xixi=90;
int gNum=1;
const int gcNum=20;void test(){int num=100;int num2=200;const int xixi1=100;cout<<&num<<endl;cout<<&num2<<endl;cout<<endl;cout<<&xixi<<endl;  //全局常量:文字常量区cout<<&xixi1<<endl; //局部常量 :staiccout<<endl;int *p=new int(20);int *p1=new int(30);cout<<p<<endl;cout<<p1<<endl;cout<<endl;cout<<&gNum<<endl;static int sNum=18;cout<<&sNum<<endl;cout<<endl;const char* pstr="i love xixi";cout<<pstr<<endl;printf("%p\n",pstr);//输出流运算符对char*的运算重载效果const int aaa=90909;/* int *const  pp=&aaa; */const int * pp=&aaa;cout<<pp<<endl;cout<<endl;cout<<static_cast<void*>(const_cast<char*>(pstr))<<endl;cout<<"&gcNum"<<&gcNum<<endl;cout<<endl;printf("%p\n",&test);
}int main(void)
{test();cout<<endl;printf("%p\n",&main);return 0;
}

09,C风格字符串

#include <iostream>
#include <cstring>
using std::cout;
using std::endl;void test(){char arr[3]={'i','s','\0'};char arr1[]={'a','q'};char arr2[]="i love xixi";cout<<arr<<endl;cout<<arr1<<endl;cout<<arr2<<endl;printf("%p\n",arr);printf("%p\n",arr1);printf("%p\n",arr2);
/* 0x7fff73681fd9 */
/* 0x7fff73681fd7 */
/* 0x7fff73681fdc */
//char * arr te shu xiao guo1const char* pp="i love xixi pp";/* char* pp="hello"; *//* pp[0]='H'; *///段错误cout<<pp<<endl;cout<<endl;const char* ps="i love xixxi ps";char* pssss=new char[strlen(ps)+1]();strcpy(pssss,ps);const char* pppp=new char[10]{'h','e','l','l','o'};cout<<pppp<<endl;cout<<pssss<<endl;delete [] pssss;pssss=nullptr;delete [] pppp;pppp=nullptr;}int main(void)
{test();return 0;
}

10,作业

01,在( )情况下适宜采用inline定义内联函数。(多选题)

  • A  函数体含有循环语句

  • B  函数体含有递归语句

  • C  函数代码少、频繁调用

  • D  函数代码多、不常调用

  • E  需要加快程序执行速度

02,写出下面程序的运行结果。   10/26  26/10  10/26  25/11

#include <iostream>using std::cout;
using std::endl;void f2(int &x, int &y)
{
int z = x;
x = y;
y = z;
}void f3(int *x, int *y)
{
int z = *x;
*x = *y;
*y = z;
}int main()
{
int x, y;
x = 10; y = 26;
cout << "x, y = " << x << ", " << y << endl;
f2(x, y);
cout << "x, y = " << x << ", " << y << endl;
f3(&x, &y);
cout << "x, y = " << x << ", " << y << endl;
x++; // ++x
y--;
f2(y, x);
cout << "x, y = " << x << ", " << y << endl;
return 0;
}

03,C++内存布局是怎样的?可以具体阐述一下么?

1,栈区
操作系统控制,高地址--》低地址(编译器优化显得低地址--》高地址)

2,堆区
程序员分配,低地址--》高地址,和栈区没有明确的界限

3,全局/静态区
读写段(数据段)存全局、静态变量

4,文字常量区
只读段,存程序中直接使用的文字常量和全局常量

5,程序代码区
只读段,存放函数体的二进制代码

04,在自定义命名空间MySpace中定义add函数,能够实现多个数据的加法(两个int、一个double一个int、一个int一个double、三个int),并跨模块调用add函数,使用using声明机制验证其功能。还可以适当给函数参数赋默认值,进行缺省调用的练习。

#include <iostream>
using std::cout;
using std::endl;//函数重载
//编译器的名字改变机制将函数的名字改编成了与参数信息相关的名字
int add(int x,int y){cout<<"int+int"<<" \t\t"; return x+y;}
int add(int x,int y,int z){cout<<"int+int+int"<<" \t\t"; return x+y+z;}
double add(double x,double y){cout<<"double+double"<<" \t\t"; return x+y;}
double add(int x,double y){cout<<"int+double"<<" \t\t"; return x+y;}
double add(double x,int y){cout<<"double+int"<<" \t\t"; return x+y;}
/* void  add(int x,double y){cout<<"int+double"<<" "; } *///用C的方式编译函数
//不可以进行函数重载
extern "C"{
int func(int x,int y){cout<<"int+int"<<" "; return x+y;}
/* int func(int x,int y,int z){cout<<"int+int+int"<<" "; return x+y+z;} */
int func01(int x,int y,int z){cout<<"int+int+int"<<" "; return x+y+z;}
}/* void ffunc(int x,int y){ */
/*     cout<<"x="<<x<<"\t\t"; */
/*     cout<<"y="<<y<<endl; */
/* } */
/* void ffunc(int x,int y=6){ */
/*     cout<<"x="<<x<<"\t\t"; */
/*     cout<<"y="<<y<<endl; */
/* }//备胎 */
void ffunc(int x=9090,int y=6){cout<<"x="<<x<<"\t\t";cout<<"y="<<y<<endl;
}//备胎/* void ff(int x=10086,int y); */
void ff(int x,int y=10086);
//实现与声明分离,建议默认值给声明
//顺序默认从右到左int dd(int x,int y,int z=100){cout<<"int+int+int"<<" \t\t"; return x+y+z;}
int dd(int x,int y){cout<<"int+int"<<" \t\t"; return x+y;}
//函数重载+默认值,可能会引发冲突/* void test(){ */
/*     cout<<add(1,2)<<endl; */
/*     cout<<add(1,2,3)<<endl; */
/*     cout<<add(1.5,2.5)<<endl; */
/*     cout<<add(1,2.5)<<endl; */
/*     cout<<add(1.3333,2)<<endl; */
/*     cout<<add(1,2.77)<<endl; *//*     //缺省调用 */
/*     ffunc(10,9); */
/*     ffunc(2); */
/*     ffunc(); *//*     ff(10,9); */
/*     ff(10); *//*     cout<<dd(10,10,10)<<endl; */
/*     /1* dd(10,10); *1/ */
/* } */void ff(int x,int y){cout<<"x="<<x<<"\t\t";cout<<"y="<<y<<endl;
}//备胎/* int main(void) */
/* { */
/*     test(); */
/*     return 0; */
/* } */
#include <iostream>
using std::cout;
using std::endl;extern int add(int,int);
extern double add(double,double);
void test0001(){cout<<add(2,5)<<endl;cout<<add(2.8989,5.789)<<endl;
}
int main(){test0001();return 0;
}

05,简述C++中引用与指针的联系与区别

联系:

1,都有地址的概念

2,引用的底层是靠指针实现的,可以视为一个受限制的指针

区别:

1,引用必须初始化,指针可以不初始化

2,引用不能修改绑定,指针可以

3,在代码层面,对引用本体取地址取到的是变量本体的地址,对指针取址取到的是指针变量的地址

06,什么是函数重载?其实现原理是什么?如何进行CC++的混合编程?

函数重载:C++允许函数名相同,参数类型、数量不同的函数在同一作用域同时出现

实现原理:名字改编(函数名称相同的时候,会根据参数的类型、顺序、个数进行改编,改变之后的函数名与函数信息相关

混合编程:extern "C" {}

07,什么是inline函数?inline与带参数的宏定义之间的区别是什么?

1,在函数最前面有inline关键字的声明函数
加上关键字,就是对编译器提出了内联的建议,如果建议通过,进行内联展开(即用用函数定义体 替代函数调用语句,该行为发生在编译阶段而非程序运行阶段

2,
宏函数: 优点(没有函数开销) 缺点(没有类型检查,安全隐患)
内联函数:不会增加开销,存在类型检查

08,引用作为函数返回值时要注意什么?如果函数返回值是绑定到堆上的变量的引用,应该如何安全地进行使用?

1,确保引用对象的生命周期比函数生命周期长

2,如果是堆上的内存,要避免内存泄漏(使用引用接收函数返回值,可以安全的访问堆上的变量,避免重复申请导致的内存泄露)

// 错误:返回局部变量的引用
int& getLocalValue() {int localValue = 10;return localValue;  // localValue 的生命周期结束后,引用变成悬空引用
}// 正确:返回堆上分配的对象的引用
int* getHeapValue() {int* heapValue = new int(10);return heapValue;  // 调用者负责释放内存
}int main() {int* value = getHeapValue();// 使用 valuedelete value;  // 释放内存return 0;
}

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

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

相关文章

vue 获取当前页面路由

vue2 &#xff1a; import { getCurrentInstance } from ‘vue’; //获取当前页路由 data() { return { currentRouter: ‘’,//默认路由 } } const { proxy } getCurrentInstance(); this.currentRouter proxy.$router.currentRoute.meta.title vue3 &#xff1a; import …

机器学习之随机森林

文章目录 1. 随机森林概述1.1 定义与起源1.2 与其他算法的比较 2. 随机森林的工作原理2.1 决策树基础2.2 Bagging机制2.3 随机性的引入 3. 随机森林的构建过程3.1 数据准备3.2 特征选择3.3 多棵树的集成 4. 随机森林的优缺点分析4.1 优势4.2 局限性 5. 随机森林的应用场景5.1 分…

Go调度器

线程数过多,意味着操作系统会不断地切换线程,频繁的上下文切换就成了性能瓶颈.Go提供一种机制 可以在线程中自己实现调度,上下文切换更轻量,从而达到线程数少,而并发数并不少的效果,而线程中调度的就是Goroutine 调度器主要概念: 1.G:即Go协程,每个go关键字都会创建一个协程…

Vulnhub JIS-CTF靶机详解

项目地址 https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/ 修改靶机的网卡 开机时长按shift&#xff0c;进入此页面 选择root模式进入 将只读模式改为读写模式 mount -o remount,rw / 查看本机的网卡名称 …

C语言进阶(9)

程序的执行时有两种环境&#xff0c;一种是翻译环境&#xff0c;另一种是执行环境。程序先经过编译成为obj的后缀的文件&#xff0c;然后将文件和链接库链接起来&#xff0c;然后将形成可执行程序&#xff0c;前者时翻译环境&#xff0c;后者时执行环境。(链接库就是库函数的所…

C语言——构造类型

构造类型 数据类型分类 结构体 结构体的定义 定义&#xff1a;自定义数据类型的一种&#xff0c;关键字 struct &#xff0c;结构体类型的变量可以存储多个不同数据类型的数据。 定义格式&#xff1a; struct 结构体名 { 数据类型1 成员名称1; 数据类型2 成员名称2; … } 注…

element-plus的表单输入框有清除按钮的,文字输入前后宽度不一致怎么解决

输入内容之后多了一个可清除的图标&#xff0c;输入框的宽度也被撑开了 根据输入前后的dom对比发现&#xff0c;多了一个图标的span标签 :deep(.el-input__wrapper) {position: relative;.el-input__inner {padding-right: 18px;}.el-input__suffix {position: absolute;right:…

【qmake: No such file or directory 的问题解决最全】

尝试1 qmake: could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’: No such file or directory 执行 qmake -v出现错误&#xff1a;qmake: could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’: No such file or directory 分析&#xff1a; qtchooser默…

【简历】北京某985大学:JAVA秋招简历指导,面试通过率较高

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 我们今天要看一位来自25届985同学的JAVA简历。 既然要参加校招的话&#xff0c;我们校招法典的第一准则&#xff1a;定你的学校层次。 …

Java面试八股之什么是消息队列

什么是消息队列 消息队列&#xff08;Message Queue&#xff09;是一种应用程序间通信&#xff08;IPC&#xff09;的形式&#xff0c;它允许进程将消息发送到另一个消息队列&#xff0c;接收端则可以在任何时刻从队列中取出这些消息进行处理。消息队列提供了一种异步处理、解…

java后端正式的企业级项目规范——苍穹外卖篇一

我在极速一个月学完黑马的《java web》课程之后跟着他写了一个java后端项目&#xff0c;但是后面我才发现那只是为了巩固基础的一个简单课程项目&#xff0c;跟实际开发的项目根本不一样。然后后面我暑假去了超星的移动图书馆开发部实习&#xff08;我主要做前端的&#xff09;…

深度优化Nginx负载均衡策略,携手Keepalived打造高可用服务架构新纪元

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

【JavaEE初阶】文件操作和IO

目录 &#x1f334;认识文件 &#x1f6a9;树型结构组织和目录 &#x1f6a9;文件路径&#xff08;Path&#xff09; &#x1f6a9; 文件分类 &#x1f38d;Java 中操作文件 &#x1f6a9; File 概述&#xff1a; &#x1f4cc;属性 &#x1f4cc;构造方法 &#x1f4c…

企业大模型业务架构技术选型分析

AI赋能企业&#xff1a;选择适合你的大模型业务架构 现代企业中&#xff0c;大模型业务日益普及&#xff0c;主要涵盖AI Embedded、AI Copilot和AI Agent三大架构。本文深入剖析其特性与适用场景&#xff0c;为企业选择合适的大模型业务架构提供指导&#xff0c;助力企业高效应…

Spring容器启动的过程(main)

大体流程如下 1、初始化 首先&#xff0c;Spring会通过用户提供的配置信息&#xff08;例如XML文件或者注解&#xff09;来初始化一个BeanFactory&#xff0c;这个BeanFactory是Spring容器的核心&#xff0c;它负责创建和管理所有的Bean。 2、读取配置生成并注册BeanDefini…

开源一套金融大模型插件(ChatGPT)

shares vscode 插件A 股量化交易系统自研金融大模型&#xff0c;复利Chat 源码地址&#xff1a; https://github.com/xxjwxc/shares

面试题:Rabbitmq怎么保证消息的可靠性?

1.消费端消息可靠性保证&#xff1a; 消息确认&#xff08;Acknowledgements&#xff09;&#xff1a;(自动(默认),手动) 消费者在接收到消息后&#xff0c;默认情况下RabbitMQ会自动确认消息&#xff08;autoAcktrue&#xff09;。为保证消息可靠性&#xff0c;可以设置auto…

CentOS 7设置静态IP地址的详细指南

CentOS 7设置静态IP地址的详细指南 配置静态IP地址是服务器或虚拟机管理的重要步骤之一&#xff0c;特别是在需要稳定、可预测的网络环境时。本文将详细介绍如何在CentOS 7上设置静态IP地址&#xff0c;帮助确保你的系统网络配置符合需求。 1. 查看当前网络配置 在进行任何更…

文件长度超出芯片容量, 超出部份将被忽略!ch341a编程器报错解决方法

出现这个错误提示&#xff0c;说明你正在刷的是华硕主板的cap格式BIOS文件。 编程器不支持这种文件&#xff0c;需要转换成编程器专用版本BIOS文件。 华硕cap格式BIOS转编程器bios文件&#xff0c;转换工具下载地址&#xff1a;https://download.csdn.net/download/baiseled/88…

再见Figma!!新的设计,代码协作神器!【送源码】

软件介绍 Penpot 是一款专门用来帮助设计师和开发者更好地合作的软件。它可以让设计师轻松地做出漂亮的设计稿&#xff0c;还能让这些设计稿变成真正的网站或者应用的一部分。这样&#xff0c;设计师和开发者之间就不会因为沟通不畅而产生麻烦了。 Penpot 专为设计师与开发者之…