目录
前言
C++兼容C语言绝大多数的语法,C++中需要把定义文件代码后缀改为.cpp,vs编译器看到是。cpp就会调用C++编译器,linux下要用g++编译,不再是gcc。
一、C++的第一个程序
#include <stdio.h>
int main(){
printf("Hello World\n");
return 0;
}
看到这一串C语言代码是不是相当怀念。该代码在C++中也能运行,但是C++还有自己的输入输出方式。
#include <iostream>
using namespace std;
int main(){
cout << "Hello World" << endl;
return 0;
}
看到这里想必你会有点懵逼的,namespace是啥,cout是啥,endl又是啥,<<又是什么鬼。不要着急,我们的C++之旅才刚刚开始。
二、命名空间
1.namespace的价值
使用namespace(命名空间):对标识符的名称进行本地化,以避免命名冲突或者是名字污染。
说人话!!!!!
好的,我们来看下面的例子:
欸,你猜怎么着。
因为在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。意思就是非常危险!!!!!!!
在C语言中一不小心我们就会出现上述代码中的问题,于是C++中就加入了namespace来解决这个问题。。。。。你说这C++人还怪好的嘞。
2.namespace该如何定义
C++中域有函数局部域,全局域,命名空间域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。说中文就是---------命名空间给了个保护罩,让里面的变量命名变得不危险了。此外,局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
注意:
命名空间还可以嵌套。(这里就不多展示了,写两次::的事)
多文件可以定义同名namespace,他们会默认合并到一起,就像同一个namespace一样
看到这里应该有所顿悟,但还差点,别急。
3.命名空间的使用
- 指定命名空间访问,项目中推荐这种方式。
- using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
- 展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐。
// 指定命名空间访问
int main()
{
printf("%d\n", N::a);
return 0;
}
// using将命名空间中某个成员展开
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
// 展开命名空间中全部成员
using namespce N;
int main()
{
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
看到这你已经对命名空间的使用了解的差不多了。想必你会对 “<<” ,">>","::"之流感到困惑,马上为你解答。
三、C++输入&输出
- <iostream>是Input Output Stream的缩写,是标准的输入、输出流库,定义了标准的上输入、输出对象。
- <<是流插⼊运算符,>>是流提取运算符。在C语言中这俩哥们还是左移/右移操作符。
- std::cin是istream类的对象,它主要面向窄字符的标准输入流。
- std::cout是ostream类的对象,它主要面向窄字符的标准输出流。
- std::endl是一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区。也就是说,除了C语言中的 \n 以外,我们还可以 std::cout << std::endl 来代替换行的效果。这边再插入一些打印换行的方法:
//使用std::endl:
int number = 42;
std::cout << "The value of number is: " << number << std::endl;
//使用\n进行换行
std::cout << "Hello, World!\n";std::cout << "The value of number is: " << number << "\n";
//使用<<运算符分开两个输出操作
std::cout << "Hello, World!";
std::cout << std::endl;
那么,C++特有的输入输出方式有什么优势呢???
C语言中的 printf/scanf 需要手动指定格式,C++则可以自动识别变量类型(本质通过函数重载实现,欲知后事如何且听下面讲解),此外,C++还能更好的啊支持自定义类型对象(结构体,联合体,枚举。。。。)的输入输出。
cin/cout/endl等都属于C++标准库,C++标准库都放在一个叫std的命名空间中,所以要通过命名空间的使用方式去用他们。这就需要用到比较方便。
注意:在包含<iostream>的时候会间接包含了<stdio.h>,所以我们同样可以使用 printf/scanf 。
四、缺省参数
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(); // 没有传参时,使⽤参数的默认值
Func(10); // 传参时,使⽤指定的实参
return 0;
}
没错,Func函数里的参数就是所谓的缺省参数。
注意:
- 缺省参数有全缺省和半缺省。全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。
C++规定半缺省参数必须 从右往左依次连续缺省,不能间隔跳跃给缺省值。
-
-
函数声明和定义分离时,缺省参数 不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
五、函数重载
// 1、参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
// 2、参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
void f1()
{
cout << "f()" << endl;
}
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}
上面两个函数构成重载,但是调用时,会报错,存在歧义,编译器不知道调用谁。也很好理解,当你调用f1()时,到底是调用有缺省值的f1还是没有参数的f1呢,编译器就迷糊了。
总结
本章我们对C++独有的命名空间形式和使用,相较于C语言更方便的输入/输出,神奇的缺省参数,迷人的函数重载做了认识,下一回将对大头---引用,内联做详解。
码字不易,麻烦给个三连给在下做酒钱,咱们江湖相见!