初识c++

目录

[1. C++前言介绍](#1. C++前言介绍)

1.1什么是C++?

1.2C++的发展历史

2.命名空间

2.1关于命名空间(namespace)

2.2命名空间的使用

2.3嵌套命名空间

3.C++输入输出


1. C++前言介绍

1.1什么是C++?

C++ 是一门通用、高性能、跨平台面向对象编程语言 ,由丹麦计算机科学家 本贾尼・斯特劳斯特鲁普(Bjarne Stroustrup) 在 1979 年左右,基于 C 语言扩展开发而来。

简单来说:C++ = C 语言 + 面向对象 + 现代编程特性,它既保留了 C 语言操作硬件、极致高效的优点,又增加了更适合开发大型软件的高级功能。

1.2C++的发展历史

C++还在不断的向后发展 。但是:现在社会上主流使用还是C++98C++11,所有重点要把C++98和C++11 掌握好,随着对C++理解不断加深,有时间可以去琢磨下更新的特性。

2.命名空间

2.1关于命名空间(namespace)

在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的
在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的
----- 命名空间就是为了防止「名字冲突」,让代码更安全、更清晰
例如:你想创建一个rand的全局变量,但与所用库里面的冲突了,这时候就会报错
注:编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
// 编译报错:error C2365: "rand": 重定义;以前的定义是"函数"
printf("%d\n", rand);
return 0;
}

接下来我们就可以创建一个自己的命名空间

cpp 复制代码
#include<stdlib.h>
#include<stdio.h>

//namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下
//⾯的rand不在冲突了

namespace qt//命名空间的名字
{
    //定义变量
    int rand=10;   //这样就不会报错了
    //定义函数
    int Add(int a,int b)
    {
        return a+b;
    }
    //定义类型
    struct node
    {
        struct node*next;
        int val;
    };
    //嵌套命名空间
    namespace sub
    {
        int c;
		int d;
		int Sub(int a, int b)
		{
			return a - b;
		}
	}
    int main()
    {
        // 这⾥默认是访问的是全局的rand函数指针
        printf("%p\n", rand);
        // 这⾥指定bit命名空间中的rand
        printf("%d\n", bit::rand);
        return 0;
    }

上面的代码定义了一个名为qt的命名空间,该命名空间包含有变量、函数、类型、命名空间。和其他名字一样,命名空间的名字也必须在定义它的作用域内保持唯一 ,如果在同一个作用域中出现多个相同名字的命名空间,编译器最后会把他们合并,这意味着命名空间可以是不连续的。命名空间既可以定义在全局作用域内,也可以定义在其他命名空间中,但是不能定义在函数或类的内部。、

2.2命名空间的使用

每个命名空间都是一个作用域
编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。
命名空间中的每个名字都必须表示该命名空间内的 唯一实体 。因为不同命名空间的作用域不同,所以 在不同命名空间内可以有相同名字的成员
定义在某个命名空间中的名字可以被该命名空间内的其他成员直接访问,也可以被这些成员内嵌作用域中的任何单位访问。 位于该命名空间之外的代码则必须通过域作用限定符::明确指出所用的名字属于哪个命名空间

cpp 复制代码
namespace qt
{
	int a = 10;
    int b = 20;
}

int a = 30;//全局

int main()
{
	int a = 20;//局部
	printf("%d\n", a); 
	printf("%d\n", ::a);       //  ::前面什么都不写代表全局域
	printf("%d\n", qt::a);    //qt的命名空间
	return 0;
}
 


接下来是命名空间的三种使用方法
1.命名空间名称及作用域限定符

cpp 复制代码
int main()
{
    printf("%d\n", qt::a);
    return 0;    
}

2.使用using将命名空间中某个成员展开

cpp 复制代码
using qt::a;
int main()
{
    int a=10;
    printf("%d\n", qt::a);
    printf("%d\n", a);
    return 0;    
}

3.展开命名空间的所有成员

cpp 复制代码
using namespce qt;//展开

int a=100;
int main()
{
    printf("%d\n", a);//这里会报错
    printf("%d\n", qt::a);//要明确出自哪里
    printf("%d\n", b);
return 0;
}

using namespace qt这是将整个命名空间展开,将使得所有作用域都可以访问qt

当命名空间被展开,很可能会跟其他定义的名字成员产生冲突。但是这种冲突是被允许的 ,但必须明确指出名字的命名空间

2.3嵌套命名空间

嵌套的命名空间同时是一个嵌套的作用域,它嵌套在外层命名空间的作用域中。嵌套的命名空间中的名字遵循的规则与往常类似:内层命名空间声明的名字将隐藏外层命名空间声明的 同名成员。在嵌套的命名空间中定义的名字只在内层命名空间中有效,外层命名空间的代码想要访问它必须在名字前添加限定符。

cpp 复制代码
namespace qt
{
	int a = 10;
	namespace qt1
	{
		int a = 10;//将外层作用域的a隐藏了
		int b = 20;
	}  
	int c = qt1::b;//正确访问的是qt1里面的d

	namespace qt2
	{
		int q = qt1::d;//正确
	}
}

int main()
{
	printf("%d\n", qt::qt2::q);
	printf("%d\n", qt::qt1::a);
	printf("%d\n", qt::a);
	return 0;
}

3.C++输入输出

cpp 复制代码
#include<iostream>
using namespace std;
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
int main()
{
	cout << "Hello C++" << endl;
	return 0;
}

关于<iostream>是c++的头文件(新编译器),不+.h(有点旧编译器还支持<iostream.h>格式)

cout标准输出对象(控制台) ,endl输出换行符 + 刷新缓冲区 ,专门用在 cout 输出语句里。

cin标准输入对象(键盘),它们都要包含头文件及按照命名空间的使用方法去使用std

<<是流插入运算符,>>是流提取运算符。

使用C++的输入输出更加方便,不需要像printf和scanf输入输出那样,需要手动控制格式。C++的输入输出可以自动识别变量类型(本质上是运算符重载),但cout和cin的效率比较低。

相关推荐
qq_5896660511 小时前
Java微服务介绍及应用
java·开发语言·微服务
OPEN-F11 小时前
C++进阶教程:运算符重载与类型转换
java·c++·算法
uoKent11 小时前
c++中的extern关键字
开发语言·c++
牧杉-惊蛰11 小时前
将数组对象根据自定义排列
java·开发语言·算法
君顾112 小时前
家校托管互通:从需求分析到系统架构的落地实践
java·开发语言·托管
jimy112 小时前
c++隐式移动构造、强制拷贝省略、返回具名局部变量
开发语言·c++
v_for_van12 小时前
C语言__attribute__
服务器·c语言·开发语言·mcu·嵌入式·嵌入式实时数据库
工业一体机老司机13 小时前
Python实现工业一体机Modbus-TCP通信-从协议解析到多设备轮询实战
开发语言·python·tcp/ip
fpcc13 小时前
跟我学C++中级篇—static_assert和assert
开发语言·c++