您现在的位置是:首页 >技术杂谈 >【C++】C++入门网站首页技术杂谈

【C++】C++入门

蛋超饭不要加蛋 2024-06-11 00:00:02
简介【C++】C++入门

目录

?一.C++关键字?

?二.命名空间?

2.1命名空间的定义

2.2命名空间的使用

2.2.1加命名空间名称和作用域限定符 

2.2.2使用using 将命名空间中某个成员引入

2.2.3使用using namespace将命名空间引入

?三.C++输出和输入?

?四.内联函数?

4.1内联函数的概念

4.2内联函数的特性

4.2.1以空间换时间

4.2.2inline对于编译器只是一个建议

4.2.3内敛函数不建议声明和定义分明


?一.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. <<是流插入运算符,>>是流提取运算符
5.c语言的输入输出需要使用格式控制符控制格式和类型,而 C++的输入输出可以自动识别变量的类型
6. C++由于兼容C语言,故输入输出也可以使用C语言的scanf和printf进行输入输出控制,有时候两者交叉使用如输入使用C++函数,输出使用C语言函数等会起到更好的效果

?四.内联函数?

4.1内联函数的概念

        以 inline修饰 的函数叫做内联函数, 编译时 C++ 编译器会在 调用内联函数的地方展开 ,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率
        我们知道在调用函数的时候会开辟函数栈帧,函数结束的则销毁栈帧,栈帧的开销也需要一定的时间,而内敛函数只是在调用的地方将函数体内的代码展开,并没有开辟和销毁栈帧,因此提升了程序运行的效率

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++入门我们就先学到这,如果对您有所帮助,欢迎一键三连,您的支持是我创作的最大动力!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。