目录
C++的头文件以及using namespace std的解释以及应用
1. 第一个C++的程序首先是实现打印Hello World
我们先来对比一下C和C++最基础的语法区别;
这是C的打印Hello World
#include<stdio.h>
int main()
{
printf("Hello World");
return 0;
}
这是C++ 打印Hello World
#include<iostream>
using namespace std;
int main()
{
cout << "Hello World!"<<endl;
return 0;
}
对比之下包含的头文件不同、C++比C多了“using namespace std;”、还有printf换为cout。接下来就对C++和C语言代码的不同处进行解释
C++的头文件以及using namespace std的解释以及应用
1. C++的输入和输出
- <iostream>是Input Output Stream的缩写,是标准的输入输出流库,定义了标准的输入输出对象。
-
std::cin 是 istream 类的对象,它主要面向窄字符(narrow characters (of type char))的标准输入流,也就类似scanf的使用,但它不需要考虑输入的格式。
-
std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流,类似printf的使用,和cin一样不需要考虑输入格式,所以C++的流能更好的⽀持⾃定义类型对象的输⼊输出。
-
“<<”是流插⼊运算符搭配cout使用,">>"是流提取运算符搭配cin使用。
-
std::endl 是⼀个函数,他的作用与C的‘\n’(换行符)类似流插⼊输出时,相当于插入⼀个换行字符加刷新缓冲区。
-
cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去用他们。
-
而在vs编译器里C++和C是相容的,尽管我们没有包含<stdio.h>的头文件也一样可以使用scanf和printf,因为在<iostream>里已经间接包含了。
2. namespace的定义
- 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。当要使用命名空间里的变量/函数/类型时则需要遵循命名空间的名字加 " :: "。如下
#include<iostream>
using namespace std;
namespace MT
{
int age = 19;
}
int main()
{
cout << "The age is: " << MT::age << endl;
return 0;
}
- namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量。所以我们可以同时创建两个同名但不同域的变量进行使用,如下
👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇#include<iostream> using namespace std; namespace MT { int age = 19; } int main() { cout << "The First age is: " << MT::age << endl; int age = 20; cout << "The Second age is: " << age << endl; return 0; }
运行结果为:
-
C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
-
namespace只能定义在全局,当然他还可以嵌套定义。代码如下
#include<iostream> using namespace std; namespace _class { namespace MM { int age = 19; } namespace WW { int age = 20; } } int main() { cout << "MM's age: " << _class::MM::age << endl; cout << "WW's age: " << _class::WW::age << endl; return 0; }
👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇
运行结果为:
- using namespace std;的含义是 把一个名为std的且里面放着C++标准库的命名空间展开,当我们想要展开上面的_class命名空间的话也同理。
缺省函数
- 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调用该函数时,如果我们没有传指定的实参过去则使用形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。代码如下:
#include<iostream> using namespace std; int test01(int n = 10) { return n * n; } int main() { int temp1 = test01(); cout << "没有指定实参的test01: " << temp1 << endl; int temp2 = test01(20); cout << "有指定实参的test01: " << temp2 << endl; return 0; }
👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇
运行结果为:
- 全缺省就是全部形参都是缺省值(void test01(int a = 10,int b = 20)),半缺省就是部分形参给缺省值也就是(void test01(int a, int b = 20))。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。实现代码如下:
#include<iostream> using namespace std; //全缺省函数 void test01(int a = 10, int b = 20) { cout << "a is: " << a << endl; cout << "b is: " << b << endl; } //半缺省函数 void test02(int a, int b = 20) { cout << "a is: " << a << endl; cout << "b is: " << b << endl; } int main() { cout << "全缺省函数的调用" << endl; test01(); test01(1); test01(1, 2); cout << "半缺省函数的调用" << endl; test02(1); test02(1, 2); return 0; }
👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇
运行结果为:
-
带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
-
函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
函数重载
- 参数类型不同代码如下:
#include<iostream> using namespace std; 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; } int main() { Add(1, 2); Add(1.0, 2.0); return 0; }
👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇
运行结果为:
-
参数个数不同代码如下
#include<iostream> using namespace std; void test(int a, int b) { cout << "test(int a, int b)的调用" << endl; } void test(int a) { cout << "test(int a)的调用" << endl; } int main() { test(1, 2); test(1); return 0; }
👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇
运行结果为:
- 参数类型顺序不同
#include<iostream>
using namespace std;
void test(int a, char b)
{
cout << "test(int a, char b)的调用" << endl;
}
void test(char b, int a)
{
cout << "test(char b, int a)的调用" << endl;
}
int main()
{
char a = 0;
test(1, a);
test(a, 1);
return 0;
}
👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇
运行结果为:
&引用的简单介绍以及简单的使用
-
引用不是新定义⼀个变量,而是给已存在变量取了⼀个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同⼀块内存空间。(通俗点来说就是给一个变量起个别名)。
-
使用语法:类型& 引用别名 = 引用对象。
引用特性
-
引用在定义时必须初始化不然则会报错;如下:
- 一个变量可以有多个引用其实说简单点也就是像我们日常里家里人给我们起的小名而且可能可以有多个;如下:
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a;
int& c = a;
return 0;
}
- 引用一旦引用了一个实体,再不能引用其他实体;如下:
#include<iostream> using namespace std; int main() { int a = 10; int c = 20; int& b = a; cout << "a = " << a << endl; cout << "b = " << b << endl; b = c; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl; return 0; }
👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇
运行结果为:
一开始b就是a的别名 那改变b的值其实也就是改变a的值,所以a和b和c都等于20;
引用的使用
-
引用在实践中主要是于引用传参和引用做返回值中减少拷贝提⾼效率和改变引用对象时同时改变被 引用对象。
- 引用传参跟指针传参功能是类似的,引用传参相对更方便⼀些;代码如下:
#include<iostream> using namespace std; void swap(int& x, int& y) { int temp = x; x = y; y = temp; } int main() { int a = 10; int b = 20; cout << "交换前 a = " << a << " b = " << b << endl; swap(a, b); cout << "交换后 a = " << a << " b = " << b << endl; return 0; }
👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇
运行结果为:
原先我们在C中想要通过形参改变实参需要通过传地址来实现,但现在在C++我们可以直接是使用引用来实现,由上面代码可知swap的参数是(int& x, int& y),调用swap函数传a和b的值过去的意思是x 是a的别名,y是b的别名,改变x和y的实质就是改变a和b。
指针和引用的关系
-
在语法上引用是一个变量取别名,不额外开辟空间,而指针是存储一个变量的地址则需要额外开辟空间。
-
引用在定义时必须初始化,指针建议初始化但不是必须的。
-
引用在初始化引用一个对象后就不能再引用其他对象,但指针可以不断改变指向的对象。
-
引用可以直接访问对象,而指针需要解引用才能访问指向的对象。
-
指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全⼀些。
-
在sizeof中的含义不同,引用结果为引用对象的的类型大小,而指针始终是地址空间所占字节的个数(32位下占4个字节,64位下占8个字节)。
END!