什么是c++
1. c++发展史
- c语言是结构化和模块化的语言,适合处理规模较小的问题。对于复杂的问题,规模较大的程序,如网络游戏,c语言则不适合。为了解决软件危机,20世纪80年代,计算机界提出了OOP(Object Oriented Programming)思想,面向对象思想,由此,面向对象程序设计应运而生。
- 一种优秀的编程语言,一定要对于计算这件事情实现一个完整和自洽的抽象。十几年来编程语言领域的竞争,除却实现质量之外,基本是在比拼抽象的设计。而C++成功的根本原因,恰恰是因为它提供一些高级的抽象机制。
2. c++的地位与重要性
- 最近的5年,每年都会诞生超过50种新的编程语言。但是c++语言却始终位居前三,并不时地挑战榜首。
- 操作系统以及大型系统软件开发,几乎所有操作系统、所有大型软件都是C/C++写的,究其原因还是性能高,可以直接操控硬件。
- 服务器端开发,游戏开发,PC端几乎所有的游戏都是C++写的,相当多的游戏引擎都是基于C++开发的,三维游戏领域计算量非常庞大,这些高难的的需求无疑只能选C++语言。
- 嵌入式和物联网领域、数字图像处理、人工智能、分布式应用。
3. 如何学习c++
- 写博客,学习是需要不断思考并把结果沉淀,可以通过写博客来梳理自己所学。
- 多读书,前期如《C++程序设计》《C++ primer》,学习过半,大致在学完继承与多态之后,可以看下《effective C++》,教我们如何写出更好的c++程序,其中《C++ primer》可以当作字典、工具书来对待,有不懂的知识点可以主动查阅。后期在基本会用c++的阶段,可以看看《STL源码剖析》,毕竟会用STL还不够,要深入了解STL六大组件,以从容面对面试。
- 勤刷题(很重要)。
正式进入c++
1.c++关键字
2.命名空间
C语言无法解决这样的冲突:
int rand = 10;
int main()
{
printf("%d",rand);//编译报错rand重定义
return 0;
}
大家知道,不论在程序的什么位置,使用到的名字都会指向一个实体:变量、函数、类型等。然而在C++中同一个名字如果出现在不同的位置,也可能指向的是不同的实体。
在C语言中定义了三个层次的作用域:文件、函数、复合语句(用大括号括住的语句)。C++又引入了类作用域,在不同的作用域内可以定义相同的名字,它们互不干扰、各司其职,例如:
class cat
{
void meow();
//...
};
class dog
{
void meow();
//...
};
但是在引用时要说明它属于哪个类:
void cat::meow()
{
//...
}
void dog::meow()
{
//...
}
先了解一个概念:文件是不同的作用域,但是如果在两个文件的全局域定义了同名的变量或者函数,那么在进行连接时会报错:
问题在于全局变量的作用域是整个程序,而在同一个作用域内不允许出现同名函数或者变量,解决办法是使用关键字 extern :如果一个全局变量或函数在文件1中定义了,而在文件2想使用,就可以用extern在文件2中声明这个标识符,他们就是同一个变量或者函数。
命名空间的引出:
所谓命名空间,就是程序猿指定的一些分隔开来的空间域,把一些全局实体分别放在各个命名空间中,定义了一个新的作用域,以此把其他全局实体分隔开来,以免产生冲突。
命名空间的定义 :
namspace cat //自主定义
{
//变量,函数、结构体、类、模板、命名空间
int dog = 666;
void woof();
}
- 在其他作用域的使用:
cat::meow
cat::woof();
- 或者将命名空间中的某个成员引入:
using cat::dog;
int main()
{
cout<<dog;
}
- 直接在全局将命名空间展开:、
using namespace std;
int main()
{
int a = 3;
cout<<a;
}
这里使用的就是std::cout
注意:
编译器会把不同文件的命名空间合并在一起。
3.缺省参数与函数重载
在C++中,函数的参数列表可以赋予默认值,也就是说,如果一个函数有缺省参数,那么在调用他的时候可以传参,也可以不传参。如果不传参,参数就是默认值,如果传参,参数就是给定的值。
需要注意:
如果函数声明与定义分离,那么只在函数声明时给缺省参数,函数定义时不写默认参数。
4.引用
引用为对象起了另外一个名字
int a = 6;
int& b = a;
引用把所有操作a与b绑定在了一起,更准确的说,a和b在内存中占用同一块空间。
需要注意的是:
引用必须初始化且必须引用变量,若必须要引用常量,应该:
const int& a = 0;
5.内敛函数
用法:
inline void bird()
{
//...
}
作用:
建议(只是建议,有可能不会这么做)编译器在调用此函数处直接将此函数展开,而不是调用该函数,通常内联函数不建议声明与定义分离,因为会可能导致链接错误。