您现在的位置是:首页 >技术杂谈 >【C++】C++入门网站首页技术杂谈
【C++】C++入门
目录
?一.C++关键字?
C++在C语言的基础上扩展了一些关键字,C语言总共有32个关键字,C++总共有63个关键字
asm
|
do
|
if
|
return
|
try
|
continue
| |
auto
|
double
|
inline
|
short
|
short
|
for
| |
bool
|
dynamic_cast
|
int
|
signed
|
typeid
|
public
| |
break
|
else
|
long
|
sizeof
|
typename
|
throw
| |
case
|
enum
|
mutable
|
static
|
union
|
wchar_t
| |
catch
|
explicit
|
namespace
|
static_cast
|
unsigned
|
default
| |
char
|
export
|
new
|
struct
|
using
|
friend
| |
class
|
extern
|
operator
|
switch
|
virtual
|
register
| |
const
|
false
|
private
|
template
|
void
|
true
| |
const_cast
|
float
|
protected
|
this
|
volatile
|
while
| |
delete
|
goto
|
reinterpret_cast
|
?二.命名空间?
在C语言中我们知道,同一个作用于不能存在两个名字相同的变量或者函数,C++中为了避免命名冲突的问题,引入了命名空间的问题,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突的问题
以下面的代码为例
#include<stdio.h>
int rand = 100;
int main()
{
printf("rand:%d", rand);
return 0;
}
上述代码就是正常输出全局变量rand的值,输出结果为100
在此基础上再包一个头文件试试
#include<stdio.h>
#include<stdlib.h>
int rand = 100;
int main()
{
printf("rand:%d", rand);
return 0;
}
此时编译却报错了
报错信息显示rand重定义,原因是stdlib.h里面有一个库函数rand,其和全局变量rand重名了,所以C++提出了namespace来解决
2.1命名空间的定义
命名空间的定义需要用到namespace关键字,语法格式为:
namespace 空间名
{ 命名空间成员}
将上面的例子用命名空间来优化
#include<stdio.h>
#include<stdlib.h>
namespace huangchao
{
int rand = 100;
}
int main()
{
printf("rand:%d", rand);
return 0;
}
可以看到把全局变量放到自己定义的命名空间里面,编译就没有报错了
命名空间还可以嵌套
#include<stdio.h>
#include<stdlib.h>
namespace huangchao
{
namespace huangchao1
{
int rand = 100;
}
}
int main()
{
printf("rand:%d", rand);
return 0;
}
总结:定义了一个命名空间就相当于定义了一个新的作用域,以前在C语言中的作用域只有全局和局部两种,而C++的命名空间则可以新增作用域,命名空间的所有成员都局限在该命名空间内
2.2命名空间的使用
下面的代码虽然编译没有报错,但是会正常输出rand的值吗
#include<stdio.h>
#include<stdlib.h>
namespace huangchao
{
int rand = 100;
}
int main()
{
printf("rand:%d", rand);
return 0;
}
可以看到并没有输出命名空间huangchao里面变量rand的值,而是一个随机值,这是为什么呢
原因是:在函数内部访问一个变量时,会默认优先在局部找,然后再去全局找,也就是局部优先,但是并没有默认去命名空间去找,所以找不到命名空间的rand
那么让编译器去我们指定的命名空间找呢,有以下三种方式
2.2.1加命名空间名称和作用域限定符
依然以rand为例,要想访问命名空间huangchao里面的rand,可以制定命名空间让编译器去指定的命名空间找
语法格式:命名空间::变量或函数名
其中::为作用于限定符,即限定了编译器只能在指定的命名空间找
#include<stdio.h>
#include<stdlib.h>
namespace huangchao
{
int rand = 100;
}
int main()
{
printf("rand:%d", huangchao::rand);//命名空间加作用域限定符
return 0;
}
可以看到正常输出了命名空间里面的rand值
2.2.2使用using 将命名空间中某个成员引入
语法:using 命名空间::变量或函数名;
#include<stdio.h>
#include<stdlib.h>
namespace huangchao
{
int a = 1000;
}
using huangchao::a;//将命名空间huangchao里面的a变量引入
int main()
{
printf("a=%d", a);
return 0;
}
可以看到正常输出了命名空间huangchao的变量a
2.2.3使用using namespace将命名空间引入
语法:using namespace 命名空间名称;
此方式相当于将命名空间的成员在此处展开,意思就是我要使用该命名空间的成员
#include<stdio.h>
#include<stdlib.h>
namespace huangchao
{
int a = 1000;
}
using namespace huangchao;//使用using namespace将命名空间引入
int main()
{
printf("a=%d", a);
return 0;
}
可以看到正常地输出了命名空间huangchao的变量a
?三.C++输出和输入?
学习每个编程语言我们都喜欢第一次输出的hello world,先看下C++的hello world
#include<iostream>
using namespace std;//使用命名空间引入
int main()
{
cout << "hello world" << endl;//输出hello world
return 0;
}
1.std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
2.c语言的输入输出标准是scanf和printf,而C++则为cin和cout,C语言使用输入输出函数需要包含头文件stdio.h,而C++需要包含头文件iostream,并且同时需要使用命名空间std
3.endl类似于c语言中的‘ ’,为换行符
?四.内联函数?
4.1内联函数的概念
4.2内联函数的特性
4.2.1以空间换时间
内联函数本质上是以空间换时间的做法,在编译阶段编译器会把函数调用替换成函数体里面的内容,会使编译后的文件变得更大
举个例子:有一个交换函数Swap,此函数只有三行代码,一个项目中需要调用其1000次,则则调用该函数总共的代码行数为1000+3
如果将该函数改为内联函数,则调用该函数的总代码为1000*3+1000,由此可见,内联函数增大了编译后文件的大小
4.2.2inline对于编译器只是一个建议
inline对于编译器只是一个建议,不同的编译器对于该建议实现的机制可能不同
由4.2.1可知,内联函数会由于直接在调用处展开函数体的代码,因此会增大编译后文件的大小,所以一般在以下情况使用内联函数:函数规模较小、非递归、频繁调用的函数使用内联函数,其他情况编译器则会忽略inline的建议
4.2.3内敛函数不建议声明和定义分明
如果内敛函数将声明和定义分离,由于内联函数只是在调用处展开函数体的代码,没有开辟函数栈帧,故编译器编译找到声明,而链接的时候由于没有栈帧故找不到函数的地址,所以导致链接错误
以一个内联函数Add函数为例,我们将Add函数声明放在Add.h中,函数定义放在Add.cpp中
然后在主函数调用Add函数
Add.h
Add.cpp
test.cpp
编译结果
报错显示无法解析的外部符号,说明编译器只找到了函数的声明,没有找到函数的定义,即在链接发生错误
好啦,关于C++入门我们就先学到这,如果对您有所帮助,欢迎一键三连,您的支持是我创作的最大动力!