当前位置: 首页 > news >正文

C++基础(1)

目录

C++的输入输出:

命名空间域:

缺省(默认)参数: 

函数重载:

引用:

内联函数inline:

 指针空值nullptr:



C++的输入输出:

输入:

int a;
char c;
std::cin >> a >> c;  //可以自动识别参数类型

输出:

int a=10;
char c=x;
std:: cout << a << " " << c << endl; //cout即输出到控制面板
(输出10 x)

 endl为end line(换行的缩写)


命名空间域:

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
使用:

namespace XXX
{//在这里面的命名可以是函数名之类的例如rand
}

注意:

如果存在两个相同命名的命名空间域会自动合并。

c++的标准库放在std(standard)的命名空间里的

对于使用命名域里的我们通常有以下三种方式

1:每次调用时到它的命名域中找
std::cout <<  "hellow world" << endl;2:将某一项展开
using std::cout
.......
cout <<  "hellow world" << endl;3:全部展开
using namespace std
......
cout <<  "hellow world" << endl;

缺省(默认)参数: 

在函数的定义或声明时候对函数的参数给一个值作为默认值,当我们调用此参数的时候若没有进行传参那么就使用默认参数。

void func(int a = 10)
{return a*a;
}int main()
{int a=5;int b=fun(); //没有传参默认值为10,所以b=100;int c=fun(a); //给了参数5,c=25;return 0;
}

注意:

 1:缺省分为半缺省和全缺省

int fun1 (int a,int b=10,int c=10)  //半缺省
{return a+b+c;
}int fun2 (int a=10,int b=10,int c=10)  //全缺省
{return a+b+c;
}

 2:带缺省的函数必须从左到右依次给实参不能跳跃给实参

int fun1 (int a,int b=10)  //正确
{return a+b;
}int fun1 (int a=10,int b)  //错误
{return a+b;
}


函数重载:

C++允许在同一作用域中出现同名函数,但是要求形参不同。

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

 这可以让一个函数表现出多态性,使用更加灵活。

注意:

1:可以是函数形参个数不同。

2:可以是函数形参类型不同。

3:可以是函数形参先后顺序不同。

void fun(int a,char c);
void fun(char c,int a);

.......


引用:

引用是对一个已经存在的变量起别名,内存不会为其单独开辟空间而是与引用对象共同使用一块空间。一个对象可以有多个别名,别名也可以有别名。当别名改变时引用对象也改变。

int a=0;
int& b=a;
int& c=a;
int& d=a;    //abcd都为0
++d;         //abcd都为1//abcd的地址都是一样的

用处:

因为引用就是引用对象本身,于是如果对于一些函数的形参使用引用的结构就在去改变形参那么就可以实现不需要通过指针的方式改变实参。

void Swap(int& rx,int& ry)
{int tmp=rx;rx=ry;ry=tmp
}int main()
{int a=10;int b=0;Swap(a,b)    //不用传指针
}

 

const引用:

对于引用前加const的情况:

1:对于const的变量或者常量进行引用时

const int a=1;
int& pa=a;     //这种写法是错误的,不能进行权限放大(原本是不可修改的变量)
const int& pa=a;    /正确的

2 :const可以进行权限缩小

int a=1;
const int& pa=a;  //pa不可改变(权限缩小只读不写)

3:在产生中间变量的时候

int a=1;
const int b=2;
double f=13.14;
const int& sum=(a+b);   //a+b的结果会产生一个临时变量存储,临时变量有常性所以引用要加const
const int& pf=f;        //f引用为整形会存在类型转换取出整数部分用临时变量存储,具有常性

 4:在某些函数中

在传地函数中,由于形参是实参的拷,拷贝需要消耗空间和效率,于是我们可以直接通过在函数内为实参引用但是由于我们不想改变实参数或者类型不一样等原因我们就加上const。


 

内联函数inline:

概念:
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调
用建立栈帧的开销,内联函数提升程序运行的效率。

特性:
1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会
用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运
行效率。
2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建
议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不
是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。下图为
《C++prime》第五版关于inline的建议

3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址
了,链接就会找不到。

 


 指针空值nullptr:

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码

#ifndef NULL
#ifdef __cplusplus
#define NULL  0
#else
#define NULL  ((void *)0)
#endif
#endif

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何
种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

void f(int)
{cout<<"f(int)"<<endl;
}
void f(int*)
{cout<<"f(int*)"<<endl;
}int main()
{f(0);f(NULL);f((int*)NULL);return 0;
}

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的
初衷相悖。
在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器
默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void
*)0。

注意:

1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入
的。

2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 构建LangChain应用程序的示例代码:60、探索 OpenAI V1 新功能及其在 LangChain 中的应用
  • unity 手动制作天空盒及使用
  • 30 华三华为STP
  • python+django 环境搭建以及post接口封装
  • Java内存区域与内存溢出异常(自动内存管理)
  • 鸿蒙系统创建签名文件及使用创建签名文件打包并安装
  • Labview_Workers5.0 学习笔记
  • 评价ChatGPT与强人工智能的未来
  • 【虚幻引擎】UE4初学者系列教程开发进阶实战篇——生存游戏案例
  • C语言求10进制转2进制(除2取余法)
  • Linux x86_64平台指令替换函数 text_poke_smp/bp
  • python的魔法方法
  • 虚拟现实3d场景漫游体验实现了“所见即所得”
  • TCP粘包
  • 如何搭建一个新生录取查询系统
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【RocksDB】TransactionDB源码分析
  • 2017届校招提前批面试回顾
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • SpringBoot几种定时任务的实现方式
  • vue学习系列(二)vue-cli
  • WePY 在小程序性能调优上做出的探究
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 复杂数据处理
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于Java中分层中遇到的一些问题
  • 漂亮刷新控件-iOS
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 小程序button引导用户授权
  • 小而合理的前端理论:rscss和rsjs
  • 硬币翻转问题,区间操作
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #include到底该写在哪
  • #知识分享#笔记#学习方法
  • (145)光线追踪距离场柔和阴影
  • (4)STL算法之比较
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (实战篇)如何缓存数据
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)平衡树
  • *1 计算机基础和操作系统基础及几大协议
  • .NET delegate 委托 、 Event 事件
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .Net 高效开发之不可错过的实用工具
  • .NET_WebForm_layui控件使用及与webform联合使用
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • ??myeclipse+tomcat
  • @Autowired标签与 @Resource标签 的区别
  • @Mapper作用