C++——入门基础

一、第一个C++程序

C++兼容C语⾔绝⼤多数的语法,所以C语⾔实现的hello world依旧可以运⾏。当然C++有⼀套自己的输⼊输出,严格说C++版本的hello world应该是这样写的。
这个现在肯定有点看不懂,看到后面会明白点。

二、命名空间

1. C语言中,很多时候无意间都会出现命名冲突的问题,比如和包含的头文件中函数名变量名等冲突,又或者多人合作项目中合并代码时带来的命名重复问题。

为了解决这个问题,祖师爷在C++中规定了命名空间。

2. 命名空间的关键字是namespace,命名空间其实就是一个域,不同的域中可以定义相同的变量名或函数名,命名空间也可以相互包含(嵌套)。

3. 默认条件下程序不会自动去命名空间中寻找变量,使用命名空间中的变量需要使用域作用限定符(::)来访问。

4. 相同名称的命名空间在代码运行时编译器会当作同一个

5. C++标准库都放在⼀个叫std(standard)的命名空间中。

以下是命名空间的创建和访问:

实践中,如果每次访问命名空间中的内容都要使用域作用限定符是有点麻烦的,所以C++中规定了命名空间的展开,对命名空间的访问有这三种方式:

1.指定命名空间访问,项⽬中推荐这种⽅式。
2.using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
3.展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。
具体使用方式为:

三、输入与输出(简单认识)

下面几点简单看一下

1. <iostream> 是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输
出对象。
2. std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输
⼊流。
3. std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。
4. std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
5. <<是流插⼊运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)
6. 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊
7. 输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是
C++的流能更好的⽀持⾃定义类型对象的输⼊输出。
8. IO流涉及类和对象,运算符重载、继承等很多⾯向对象的知识,这些知识我们还没有讲解,所以这 ⾥我们只能简单认识⼀下C++ IO流的⽤法,后⾯我们会有专⻔的⼀个章节来细节IO流库。
9. cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要 通过命名空间的使⽤⽅式去⽤他们。
10.⼀般⽇常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。 这⾥我们没有包含<stdio.h>,也可以使⽤printf和scanf,在包含<iostream>间接包含了。vs系列 编译器是这样的,其他编译器可能会报错。

简单理解人话就是,我们在需要输入输出时要包含<iostream> 这个头文件,用cin,cout和endl结合<<和>>可以实现输入和输出操作,C++这里会自动识别变量类型,不必使用C语言中的%d等。然后就是我们使用cin,cout,endl时需要从std里找到去使用。

举个例子:

四、缺省参数

缺省参数,就是在定义函数时给函数参数一个默认值,在调用该函数时,如果没有给此参数赋值,则这个参数在函数中使用默认值。
这里会出现两种情况:全缺省和半缺省
全缺省就是全部给了默认值,半缺省给的默认值必须是从右向左,左边无,右边有,不能间隔跳跃。
结合实例看一下:
1.简单的缺省函数
2.全缺省和半缺省
另外值得一提的是, 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。

五、函数重载

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的。
同名函数参数不能相同,其他的返回值、参数类型和个数都可以不同。
注意返回值不同不能作为重载的条件,因为参数相同的话编译器不知道调用哪个。
举例:
要注意,全缺省的函数会与没有参数的同名函数构成重载,但是编译时会报错,因为编译器不知道要用哪个。
比如这个:
函数重载会让我们在调用函数时更加方便和灵活,比如C语言中实现各种数据类型的加法得使用很多的函数,addi、addf、addd......会很不方便,而有了函数重载直接不用管类型使用add就会方便很多。

六、引用

1. 引用的含义

引用,就是取别名。引用的操作符用&(和取地址是一个)。

对a取别名b并不会使内存再为b开辟一块内存空间,而是a和b共用同一块内存空间,对b修改就可以实现对a的修改。

需要注意:
1. 引⽤在定义时必须初始化
2. ⼀个变量可以有多个引⽤(就是多个别名)
3. 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体(因为这样会产生歧义,实际上是赋值)

2. 引用的使用

1. 引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象。
2.  引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。
3. 引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。
下面是引用传参的例子:
引用传参的好处:
不占用空间,直接传参的话,程序会把传过去的参数生成一份拷贝,如果遇到占用空间大的参数,会降低程序运行效率。

3. const引用

const修饰的变量,只有读的权限,没有写的权限。

对const修饰的变量的引用,权限不能放大,只能缩小(没有const修饰的变量可以取const修饰的引用)。

这里说一下临时对象:

所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,
C++中把这个未命名对象叫做临时对象。

4. 指针和引用的关系

C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功 能有重叠性,但是各有⾃⼰的特点,互相不可替代。
1. 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
2. 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
3. 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
4. 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
5. sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
6.指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。

七、inline

1. ⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率。(其实就是会把函数展开直接运行,不建立栈帧)
2. inline对于编译器而言只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。
3. vs编译器 debug版本下⾯默认是不展开inline的,这样⽅便调试,debug版本想展开需要设置⼀下以下两个地方。
4. inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。
5.  C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调
试,C++设计了inline⽬的就是替代C的宏函数。
一个正确的宏函数实现:
这里a和b里面和外面的括号都要加(替换后有可能会导致优先级问题),并且不能在后面加分号(修改了语句)
既然宏函数那么多坑,用inline代替则会避免很多不必要的错误。
这样就行:

八、nullptr

NULL实际是⼀个宏,在传统的C头⽂件(stddef.h)中,可以看到如下代码:
C++中NULL可能被定义为字⾯常量0,或者C中被定义为⽆类型指针(void*)的常量。不论采取何种
定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦,本想通过f(NULL)调⽤指针版本的
f(int*)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。f((void*)NULL);
调⽤会报错。
C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换
成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被
隐式地转换为指针类型,⽽不能被转换为整数类型。
优雅地结束......
  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 《CMake——入门到精通》是一本介绍CMake的书籍。CMake是一个跨平台的开源构建工具,它可以用于自动化构建、测试和部署应用程序、库和模块。 这本书从CMake的基本概念和用法入手,逐步深入介绍了CMake的各种功能和高级用法。首先,书中介绍了CMake的安装和配置,以及CMake项目的基本结构。然后,书中详细讲解了如何编写CMakeLists.txt文件来描述项目的构建过程,包括如何定义源文件、头文件和链接库,如何设置编译选项和链接选项,以及如何生成不同平台和编译器下的构建配置。 在介绍完CMake的基本使用后,书中着重讲解了CMake的高级功能和技巧。比如,如何使用CMake进行跨平台开发,如何进行自定义构建规则,如何配置项目的安装和打包,以及如何对大型项目进行模块化管理等等。同时,书中还提供了大量的示例代码和实用技巧,帮助读者更好地理解和应用CMake。 总的来说,《CMake——入门到精通》是一本系统而全面的CMake教程,适合想要学习和掌握CMake的开发人员阅读。无论是初学者还是有一定经验的开发者,都可以从这本书中获取到实用的知识和经验,提高项目构建的效率和质量。无论是在学习中还是在实际工作中,这本书都可以成为CMake的权威参考指南。 ### 回答2: 《cmake——入门到精通.pdf》是一本关于CMake的书籍。CMake是一个跨平台的开源构建工具,用于管理软件项目的构建过程。本书旨在帮助读者从入门到精通掌握CMake的使用。 这本书首先介绍了CMake的基本概念和原理,包括如何编写CMakeLists.txt文件以及如何配置和生成项目的构建系统。然后,书中详细介绍了CMake的常用功能和命令,包括设置编译选项、指定源文件、添加库和链接库等。此外,本书还深入讲解了CMake的高级用法,如多目录项目管理、条件编译、自定义函数和宏等。 除了基本功能和用法,本书还涵盖了CMake与其他工具和框架的集成,如与Qt、OpenGL和Boost等。读者可以学习如何使用CMake来管理复杂项目和库的构建过程。 《cmake——入门到精通.pdf》也提供了大量的示例和实战项目,帮助读者更好地理解和应用CMake。通过阅读本书,读者将能够全面了解CMake的工作原理和常用技巧,掌握使用CMake构建和管理项目的能力。 总之,借助《cmake——入门到精通.pdf》,读者可以系统地学习和掌握CMake的基本概念和高级用法,并能够灵活应用CMake来管理复杂项目的构建过程。这本书对于软件开发者和项目管理者来说,是一本非常实用和有价值的参考书。 ### 回答3: 《CMake入门到精通.pdf》是一本介绍CMake工具的书籍。CMake是一个跨平台的开源构建工具,可以用于管理和自动化C++项目的构建过程。该书以系统的方式介绍了CMake的基本概念、语法和用法。 首先,书中详细解释了CMake的背景和作用。CMake的主要功能是生成与平台无关的构建脚本,在不同的操作系统和编译器上都可以使用。它可以通过简单的配置文件来管理项目的依赖关系和编译选项。 其次,书中介绍了CMake的基本语法和常用命令。CMake使用一种类似于脚本的语言来描述项目的构建过程,通过编写CMakeLists.txt文件来配置项目。书中示例详细展示了如何编写CMakeLists.txt文件,包括设置项目名称、指定源文件、添加库和链接库等等。 然后,书中深入讲解了CMake的高级用法和技巧。CMake提供了丰富的功能来处理复杂的项目结构和构建需求,例如条件判断、循环、宏定义等。书中通过实际案例演示了这些高级特性的使用方法,帮助读者更好地理解和运用CMake。 最后,书中还介绍了CMake与其他开发工具的集成,如CTest、CPack和CDash等。CTest用于自动化测试,CPack用于生成安装包,CDash用于持续集成。书中展示了如何使用这些工具来进一步提高项目的开发效率和质量。 总之,《CMake入门到精通.pdf》通过全面而系统的方式介绍了CMake工具的使用方法,适合初学者和有一定经验的开发者阅读。读者可以通过学习这本书,掌握CMake的基本概念和语法,了解CMake在实际项目中的应用,提高项目的构建效率和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值