目录
💫只有认知的突破💫才能带来真正的成长💫编程技术的学习💫没有捷径💫一起加油💫
🍁感谢各位的观看🍁欢迎大家留言🍁咱们一起加油🍁努力成为更好的自己🍁
概述
这篇博客会先对C++的几个小语法进行讲解,以便来降低我们后续学习C++的门槛。这几个知识点比较琐碎一些,但都是我们后面学习C++的基础。
C++的第一个程序
按照学习编程的传统——写第一个代码 " hello world "。代码如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
int main()
{
std::cout << "hello world" << std::endl;
return 0;
}
运行结构如下所示:
命名空间
域
在C语言中,我们学到了局部域和全局域。在C++中,会再新增两个域——命名空间域和类域。
域的作用
<1>:域会影响变量的生命周期。
<2>:域会影响编译器的查找规则:在未特定声名某个域的前提下,编译器会默认先从局部域中查找变量,未找到的话,再从全局域中查找。
namespace的使用
namespace的格式
namespace的格式如下所示:
namespace 名字
{
...
...
}
namespace的介绍
namespace是一个关键字,它是一个关于命名空间的关键字。
作用:<1>:命名空间的出现,就是为了避免命名重复的错误。
<2>:命名空间所圈住的区域,在未指定该区域的时候,编译器在查找变量的时候会
自动跳过该区域。
展示作用<1>的效果代码:
在生成随机数中,我们会用到rand库函数,它被封装放在 <stdlib.h> 头文件里面。我们不使用namespace的情况下,直接再定一个rand变量,就会报错。当我们把rand变量放在namespace里面,就不会报错了。
如下所示的代码:——未使用namespace。
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <stdlib.h>
int rand = 20;
int main()
{
std::cout << rand << std::endl;
return 0;
}
运行结果如下所示:
如下所示:——使用namespace。
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <stdlib.h>
namespace wwp
{
int rand = 20;
}
int main()
{
std::cout << rand << std::endl; //打印的是函数的地址
return 0;
}
运行结果如下:
namespace使用注意
<1>:namespace的{ }后面没有 ' ; ' 。
<2>:namespace是可以嵌套使用的。
<3>:namespace可以定义在不同的文件中,只要命名空间的名字相同,编译器就会自动把名字相同的命名空间进行合并成一个命名空间。
<4>:namespace是为避免命名重复的,所以它是针对名字而言的。当namespace里面有结构体的时候,要注意结构体的使用——如下所示的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
namespace wwp
{
int rand = 20;
struct wzp
{
int a;
};
}
int main()
{
struct wwp::wzp s1; //放在struct后面
s1.a = 30;
std::cout << s1.a << std::endl; //打印的是函数的地址
return 0;
}
运行结果如下所示:
补充
命名空间域不影响变量的声明周期,只是影响编译器查找变量的规则。命名空间域里面的变量还是全局变量。
using关键字
using用于展开命名空间或者展开命名空间部分内容。
情景一:全展开
当你确定你的命名空间里面的内容不会与库或者其它程序员冲突时,便可以全展开。如下所示的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
namespace wwp
{
int a = 20;
}
using namespace wwp;
int main()
{
cout << a << endl;
return 0;
}
如下所示的图片:
情景二:部分展开
当命名空间域里面的某些成员被频繁使用,而且这个成员还不冲突,我们可以部分展开它。书写格式:using namespace wwp : : a; 如下所示的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
namespace wwp
{
int a = 20;
int b = 90;
}
//using namespace wwp;
using wwp::a; //部分展开
int main()
{
cout << a << endl;
cout << a << endl;
cout << a << endl;
return 0;
}
运行截图如下所示:
C++的输入&输出
在C++中,输出用的符号是:流插入(<<)===cout << 。输入用的符号是:流提取(>>)==cin>>。其中,cout和cin分别是ostream和istream实例出的对象,<<和>>是运算符重。这里涉及到类和模板的知识,会在后面的章节讲到。如下所示的代码:
#include <iostream>
using namespace std;
int main()
{
int a = 0;
cin >> a;
cout << a << endl;
return 0;
}
运行截图如下所示:
缺省参数
在C语言中,我们是不可以给函数参数显示传值的。即:int add (int x=20 ,int y=30);在C语言中,是错误的。但在C++中,这是允许的。如下所示的代码:
#include <iostream>
using namespace std;
int add(int x = 1, int y = 2) //缺省参数
{
return x + y;
}
int main()
{
cout << add() << endl; //不显示传值,使用缺省值
cout << add(10, 20) << endl;
return 0;
}
当我们不显示传值的时候,函数就会使用给定缺省值,否则就是使用你显示给的值。
运行截图如下所示:
分类
缺省参数分为:全缺省和半缺省。
全缺省:全部给缺省值。
半缺省:非全部给缺省值,部分参数给缺省值,而且必须从右向左给缺省值。
函数重载
当两个函数名相同的函数出现在同一个域中时,在C语言中就会报错,但在C++中不会报错,因为此时这俩函数构成了函数重载。
函数重载的条件:1.函数名相同。
2.出现在同一个域中。
3.参数类型,数量和顺序不同。
4.两个函数是否构成重载不看返回值。
如下所示的代码:
#include <iostream>
using namespace std;
int add(int x = 1, int y = 2)
{
return x + y;
}
float add(float x, float y)
{
return x + y;
}
int main()
{
cout << add(10,20) << endl;
cout << add(4.5f,3.2f) << endl;
return 0;
}
运行截图如下所示:
引用
引用就是给变量取别名,编译器不会为它开辟空间的,它和变量共用同一个内存空间。引用分为左值引用&和右值引用&&。如下所示的关系图:
通俗来讲——就是起外号。引用的符号——&。如下所示的代码:
int a=10;
int&b=a; //b引用a,b是a的别名
注意:1.引用必须初始化。即:int&b;是错误❌。int&b=a;才是正确✔
2.引用的对象必须存在,不能空引用。
3.引用在引用一个实体对象之后,不能再引用别的实体对象了。(也就是说:只能引 用 一个实体对象)。
const引用
const的使用
const修饰的对象具有常属性,不能被更该。如下所示的代码都具有const属性,必须要加const。
//情况一:类型转换
int b=20;
const float a=b; //构造成float临时对象,临时对象具有const属性
//情况二:const对象
const int b=20;
const int a-b;
//情况三:返回值
int add(int x,int y)
{
return x+y;
}
const int b+=add(1,5); //返回值会存放在临时对象中或寄存器中,这俩都具有const属性
const引用
权限的注意:1.权限可以缩小。
2.权限可以转移。
3.权限不可以放大。
如下所示的代码及其对应的情况:
const int a-10;
int b=a; //error:权限放大
int a=10;
const int b=a; //right:权限可以缩小
const int a=10;
const int b=a; //right:权限可以平移
指针和引用的关系
重点:
1.语法上引用不开辟空间,指针需要开辟空间来存储地址。
2.引用必须初始化。指针建议初始化,语法上不是必须的。
3.引用初始化引用一个对象之后,不能再引用别的对象了,但指针可以指向别的对象。
4.引用可以直接访问对象,但指针需要解引用再访问。
5.sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)。
6.指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全⼀些。
inline内联函数
inline的出现就是为了代替宏函数的,因为宏函数的书写特别容易出错。被inline修饰的函数叫做内联函数。内联函数在大多数场景中会被展开。inline对于编译器而言只是⼀个建议,也就是说,你加了inline编译器也可以选择在调用的地方不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适用于频繁 调用的短小函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。
如下所示的代码:
#include <iostream>
using namespace std;
inline int add(int x = 1, int y = 2)
{
return x + y;
}
int main()
{
int a = 10;
int b = 30;
add(a, b);
return 0;
}
运行截图如下所示:内联函数被直接转化为指令操作了。
nullptr
简单来说:C++的空指针用nullptr,C语言的空指针用NULL。
彩蛋时刻!!!
每章一句:“心存希冀,目有繁星。追光而遇,沐光而行。”