最美妙的语言-------C++
好久不见!!!不做过多的赘述,今天让我们一起进入C++的知识海洋里面学习吧!
文章目录
- 1. C++关键字
- 2. 命名空间
- 3. C++输入&输出
- 4. 缺省参数
- 5. 函数重载
- 6. 引用
- 7. 内联函数
- 8. auto关键字(C++11)
- 9. 指针空值---nullptr(C++11)
1. C++关键字
C++总计是有63个关键字,而C语言是有32个关键字
这里只做介绍,随着后面的学习会慢慢深入
2. 命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
特别注意:
1、同一个工程中可以允许多个相同的命名空间,编译器最后会合成同一个命名空间中。
2、一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
那么我们该如何使用命名空间呢?
举个例子:
如何解决这个问题呢?
1、加命名空间名称及作用域限定符
命名空间为N1,那么就是N1::
2、使用using将命名空间中的成员引入
3、使用using namespace 命名空间名称引入
以上三种方法都可以使用。
3. C++输入&输出
接下来讲到C++的输入和输出,那我们肯定知道C语言对应的输入输出是scanf和printf
那么C++的输入是cin,输出是cout,endl是换行,<<是流插入,>>是流提取
在使用cout和cin的时候,必须包含iostream头文件和std命名空间
4. 缺省参数
大家都好奇这个新名词吧------缺省参数
那大家知道备胎吧,好家伙这个缺省参数就是个备胎
官方的话就是说缺省参数是声明或定义函数的参数指定一个默认值,在调用参数的时候,如果没有指定实参则采用该默认值,否则使用指定的实参
举个备胎例子:
第一个fun什么参数都没有,就输出备胎1
第二个传入10,那么久输入10
这么简单的形容应该懂吧,不懂我很伤心的
缺省参数又分为半缺省和全缺省
而且缺省值必须是常量和全局变量, 另外C语言不知道缺省操作
5. 函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”
参数不同,它会自动识别。
那么为什么C++能支持函数重载,而C语言却不支持函数重载
在C/C++中,一个程序的运行,需要经历以下几个阶段:预处理,编译,汇编,链接
通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
7. 另外我们也理解了,为什么函数重载要求参数不同!而跟返回值没关系。
6. 引用
引用呢就是说一个本质的东西有很多个昵称,就像是一个人,小名叫二狗,在学校叫做小明,妈妈爸爸叫明明。
可以套用一个公式:
类型& 引用变量名(对象名) = 引用实体;
注意事项:
1、引用在定义的时候必须初始化
2、一个变量可以有多个引用,就是说可以有多个名字
3、引用一旦引用一个实体,再不能引用其他实体
我们也可以用内存来观察:
一开始都是a=1,当a自增时候,b也自增了。这时候你应该明白了了吧。
常引用:
![在这里插入图片描述](https://img-blog.csdnimg.cn/89f7368d36ca497fbeeed3c3e1e62637.png
使用的场景:
1、做参数
思考下面两个情况:
2、做返回值
可以思考一下这个问题:
答案是:7
需要注意的是:如果函数返回时,除了函数作用域,如果返回对象还没有还给系统,则可以使用引用返回,否则的话必须是传值。(局部变量作返回值就不可以使用引用)
任何时候都是用引用作参数,但是不是什么时候都可以用引用作返回值
传值返回和传引用返回哪个更胜一筹呢?
以值作为参数或者返回值时,当传参和返回期间,函数不会直接传递实参或者变量变身返回,而是将传递实参或返回值的一份临时拷贝,因此使用传值的效率非常之低下,尤其是参数或返回值类型非常大时,效率就更低了。
举个例子:
#include <time.h>
struct A { int a[10000]; };
A a;
// 值返回
A TestFunc1() { return a; }
// 引用返回
A& TestFunc2() { return a; }
void TestReturnByRefOrValue()
{ // 以值作为函数的返回值类型size_t begin1 = clock(); for (size_t i = 0; i < 100000; ++i) TestFunc1(); size_t end1 = clock(); // 以引用作为函数的返回值类型size_t begin2 = clock(); for (size_t i = 0; i < 100000; ++i)TestFunc2();size_t end2 = clock(); // 计算两个函数运算完成之后的时间cout << "TestFunc1 time:" << end1 - begin1 << endl; cout << "TestFunc2 time:" << end2 - begin2 << endl;
}
结果一目了然,传引用更快
指针与引用的区别:
1、从语法角度来说,引用没有开空间,指针开了4 or 8 byte
int main()
{
int a = 10;
int& ra = a;
cout<<"&a = "<<&a<<endl;
cout<<"&ra = "<<&ra<<endl;
return 0;
}
2、从底层实现来看,引用是用指针来实现的
int main()
{int a = 10; int& ra = a;ra = 20; int* pa = &a; *pa = 20; return 0;}
下面来看一下引用和指针的汇编代码:
总结引用和指针的不同点:
1、引用必须初始化,指针没有要求
2、引用在初始化引用一个实体,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型的实体
3、没有NULL引用,而指针有NULL
4、在sizeof中含义不同,引用的大小是引用类型的大小,而指针始终是地址空间所占字节个数(32位平台下是4字节)
5、引用自加1是实体自加1,而指针自加1是该地址偏移一个类型的大小
6、有多级指针,但是没有多级引用
7、访问实体方式不同,指针需要显式解引用,而引用是系统自己处理
8、引用相对指针比较安全
7. 内联函数
先来介绍一下宏的优缺点
宏的优点:可维护性强,宏函数提升效率,减少栈帧的建立
宏的缺点:可读性差,没有类型安全检查,不方便调试
相比较宏,inline可以完美解决宏的缺点,同时兼具宏的优点
具有的特性:
8. auto关键字(C++11)
随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:
1. 类型难于拼写
2. 含义不明确导致容易出错
auto能自动匹配类型
能够遍历,这样遍历岂不是更简单
对于auto到后面的学习会更加地深入,初步我们只是要了解,并且知道它是干什么用的
9. 指针空值—nullptr(C++11)
在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:
void TestPtr()
{
int* p1 = NULL;
int* p2 = 0; // ……
}
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。
注意:
- 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
- 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
- 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
如有错误,多多指教
最美妙的语言-------C++相关推荐
- scala语言的底层是java实现的_2020了,每个程序员都该学习的 5 种开发语言
我曾在某处读到过(可能在<代码大全>,但我不敢确定),程序员应该每年学习一门新的编程语言.但如果做不到,我建议,你至少学习以下 5 种开发语言,以便你在职业生涯有很好的表现. 每个公司都喜 ...
- 每个程序员都该学习的5种开发语言,不可错过!
每个公司都喜爱精通多种编程语言并且多才多艺的程序员.一个既能很麻利地写脚本,也能编写复杂的Java程序的程序员,确实相当有价值.所以实际上,对于高级开发者来说,学习不止一种编程语言,几乎就是必然的要求 ...
- c语言成绩报告单评语,期末成绩报告单评语
评语是对学生阶段性表现的总结性评价,也是对学生进行教育的一种方式,更是鼓舞.激励.鞭策学生的重要契机;下面是有,欢迎参阅. 1.孩子正在这一假期,总体来说比先前有长足退步,明白了斗争指标,看到了停滞指 ...
- 每个程序员都该学习的5种开发语言
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://dzone.com/articles/5-programming-language ...
- 【连载】Scala程序设计:Java虚拟机多核编程实战——简介
可以在JVM上编程的语言有很多.通过这本书,我希望让你相信花时间学习Scala是值得的. Scala语言为并发.表达性和可扩展性而设计.这门语言及其程序库可以让你专注于问题领域,而无需深陷于诸如线程和 ...
- python 好书推荐_关于Python的好书推荐(三)
1.简单易学 2.免费.开放的资源 3.高等级语言 4.流行语言 5.海量数据库 6.可扩展 Python可能是为数不多的既简单又强大的编程语言之一.这对初学者和专家都有好处,更重要的是,编程很有趣. ...
- Python官方最后通牒:Python 2传奇20年将落幕,Python 3接力!
编辑:鹏飞 | 来源:新智元 [导读]一代传奇Python 2落幕,将于3个半月后(2020年元旦当天)停止维护,被Python 3全面取代.这意味着目前还在使用Python 2的大量用户,将面临 ...
- Swift 2.0初探:值得注意的新特性
转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...
- 伴随我成长的编程书,赶紧收藏!!
一. 这篇文章是应之前在微博上爆过的下个周末某出版社的线下活动而写的.回顾我和C++在这个世纪的第二个春天开始发生过的种种事情,我发现我并不是用一个正常的方法来学会如何正常使用C++的.我的C++学习 ...
最新文章
- CentOS之——CentOS7安装iptables防火墙
- org.openqa.selenium.StaleElementReferenceException
- select 统计 没有 为0_sql where 1=1和 0=1 的作用
- keras构建卷积神经网络(CNN(Convolutional Neural Networks))进行图像分类模型构建和学习
- Windows 无法启动 NVIDIA Display Container LS 服务
- BZOJ 4665: 小w的喜糖
- MATLAB实用知识,如何对函数的输入进行检查和解析?
- BZOJ1050 [HAOI2006]旅行
- AlphaFold 和 AI 蛋白质折叠革命的下一步是什么
- php 数组随机排序_php 数组元素随机排序代码
- mybatis分页插件_MyBatis 分页插件 5.2.0 发布
- LeetCode刷题——75. 颜色分类
- aix系统怎么开启ftp服务器,liunx和aix 系统开启ftp服务
- 生物信息学的研究方向
- python怎么修改列名_PYTHON:更改列名
- 【LGP5108】仰望半月的夜空
- 计算天数(函数)(C语言实现)
- OpenResty学习——第七章 Web开发实战2——商品详情页
- Marc数据解析和拼接(java版)
- CarSim2017安装教程