C++入门

现代C++语言可以看做是三部分组成的:

  • 低级语言,大部分继承自C语言
  • 现代高级语言特性,允许我们定义自己的类型以及组织大规模程序和系统
  • 标准库,它利用高级特性来提供有用的数据结构和算法。

关于C++的发展史在网上可以找到很多,这里就不再提了。这篇博客是基础C语言的基础上来学习C++的。

一、C++关键字(C98标准)

C++入门_第1张图片

二、C++输入输出

学习每个新语言的开始都是由hello world开始的,这里用C++来写一个简单输出程序。

#include
void main()
{
    std::cout<<"hello world"<;
}

程序第一行#include
告诉编译器我们想要使用iostream库

std::cout<<"hello world"<::endl;

这条语句用了输出运算符<<在标准输出上打印消息;
endl是一个操纵符,写入endl的效果是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中。

三、命名空间(namespace)

上面的程序中,使用了std::cout和std::endl,而不是直接用cout和endl。
前缀std::是指出名字cout和endl是定义在名为std的命名空间中的。
命名空间可以帮我们避免不经意的名字冲突,以及使用库中相同名字导致的冲突,标准库定义的所有名字都在std中。
命名空间中可以定义变量、函数,命名空间就是一个作用域。可以解决名字冲突。

namespace N1{
    int a;
    int b;
}
using namespace N1;

using的意思是把N1域内的变量展开到全局,如果展开的变量和全局变量冲突,优先用全局变量。
C++中允许一个工程中存在多个相同名称的命名空间,编译器会把这些定义合成同一个命名空间。

四、缺省参数

在C++中和C语言不同的一点还有,可以配置缺省参数。
声明或定义函数时为函数的参数指定一个默认值,在调用这个函数时,如果没有指定实参就用这个默认值,如果指定了实参就用实参。

全缺省:

void TestFunc(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<cout<<"b = "<cout<<"c = "<

半缺省:

void TestFunc(int a, int b = 10, int c = 20)
{
cout<<"a = "<cout<<"b = "<cout<<"c = "<

五、函数重载

C++中允许同一作用域内声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须有一种不同,常用来处理功能类似数据不同的问题。
(main函数不能重载)

int Add(int left, int right)
{
    return left+right;
}
double Add(double left, double right)
{
    return left+right;
}
long Add(long left, long right)
{
    return left+right;
}
int main()
{
    Add(10, 20);
    Add(10.0, 20.0);
    Add(10L, 20L);
    return 0;
}

当调用重载函数时可能有三种结果:
- 编译器找到一个与实参最佳匹配的函数,并生成调用该函数的代码
- 找不到任何一个函数与调用的实参匹配,此时编译器发出无匹配的错误信息
- 有大于一个函数可以匹配,但是每一个都不是明显的最佳选择。此时也将发生错误,称为二义性调用。

六、引用和指针

一)引用

引用为对象起了另外一个名字,引用类型引用另外一种类型。通过将声明符写成&b的形式来定义引用类型,其中d是声明的变量名。

int a = 10;
int &b = a;
  1. 引用不是创建一个新的对象,只是为一个已经存在的对象所起的另外一个名字;
  2. 因为引用本身不是对象,所以不能定义引用的引用;(而指针有二级指针)
  3. 允许一个对象有多个引用;
  4. 引用只能一次,不能去引用其他实体。

二)指针

指针是指向另外一种类型的复合类型。与引用类似,指针也实现了对其他对象的间接访问。

int a = 10;
int *p = &a;

指针和引用相比也有很多不同点:
1.指针本身就是一个对象,允许对指针赋值和拷贝,而且指针的生命周期内它可以先后指向几个不同的对象;
2.指针无须再定义时赋初值。和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。
3.引用不是对象,没有实际地址,所以不能定义指向引用的指针。

七、内联函数

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

  1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用
    作为内联函数。
  2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。

你可能感兴趣的:(C++,C++)