🔥个人主页@ꪔ小林Y
🎬作者简介C++领域的学习者,专注知识拆解与代码实践,代码世界的“拆题玩家”,一边啃底层原理,一边写落地demo,主打把复杂逻辑掰成“新手能懂的样子”
📖个人专栏《C++小白闯关日记》《C语言小白闯关日记》
⭐️代码信条每一行C++代码都是成长的脚印,每一次调试成功都是对坚持的回应
在这里插入图片描述

C++入门基础

一.C++的起源和版本更新

  • C++的起源可以追溯到1979年,初步是因为有人感受到现有语言(如C语言)在表达能力,可维护性和可扩展性方面的不足,在C语言的基础上添加了面向对象的特性,逐步扩展,直到1998年,C++的ANSI/IS0标准被投入使用。
  • 随着C++版本更新,更新了以下几种版本的C++,但投入大多使用的是前两个即C++98和C++11
    在这里插入图片描述

二. C++参考文档

三.C++在工作领域中的应用

C++的应用领域服务器端,游戏(引擎),机器学习引擎,音视频处理,嵌入式软件,电信设备,金融应用,基础库,操作系统,编译器,基础架构,基础工具,硬件交互等多方面

四.C++相关书籍

《C++ Primer》,《STL源码剖析》,《Effctive C++》

五.C++的第一个程序

同样的,我们依然从hello world入手

#include<iostream>
using namespace std;
int main()
{
	cout << "hello world\n" << endl;
	return 0;
}

在这里插入图片描述
具体为什么这样写以及每一步的作用究竟是为什么,我们请继续往下研究

六.命名空间

1.C语言的弊端:命名冲突

在这里插入图片描述
在这里插入图片描述
当我们在调试运行上面这个程序时,会出现报错。原因就是因为定义的rand和<stdlib.h>库中的rand函数出现了命名冲突,那该如何解决呢?这就得提到namespace关键字了

2.namespace关键字

  • namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量。
  • C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间和类域不影响变量生命周期。
#include<stdio.h>
namespace name
{
//命名空间中可以定义变量/函数/类型
	int rand=10;
	int Add(int left,int right)
	{
		return left+right;
	} 
	struct Node
	{
		struct Node* next;
		int val;
	};
}
  • namespace只能定义在全局,可以嵌套定义
  • 项目工程中多文件中定义的同名namespace会认为是一个namespace,不会冲突
  • c++标准库都存放在一个叫std(standard)的命名空间中

3.namespace的使用

编译器语法查找确认,默认都是先局部查找,再全局查找,没有找到就报错未声明标识符。这里我们还涉及到一个标识符“::”即域作用限定符

  • (1)指定命名空间访问,项目中推荐这种方式
  • (2)using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
  • (3)展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。
#include<stdio.h>
#include<stdlib.h>
namespace test
{
	int rand = 10; 
		struct Node
	{
		struct Node* next;
		int val;
	};
}
int a = 1;
int main()
{
	int a = 0;
	printf("%d\n", a);
	//::域作用限定符
	printf("%d\n", ::a);
	// 左边什么都没有代表的是全局域
	printf("%p\n", rand);
	printf("%d\n", test::rand);
	//::左边是域的名称
	struct test::Node node;
	return 0;
}

在这里插入图片描述

七.C++的输入&输出

  • < iostream >是InputOutputStream的缩写,是标准的输入、输出流库,定义了标准的输入、输
    出对象。
  • std::cin 是istream类的对象,它主要面向窄字符(narrowcharacters(oftypechar))的标准输
    ⼊流。
  • std::cout 是ostream类的对象,它主要面向窄字符的标准输出流。(cin和cout中的c意思是默认所有的输入输出都转换成char串)
  • std::endl 是一个函数,流插入输出时,相当于插⼊⼀个换行字符加刷新缓冲区。
  • <<是流插入运算符,>>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)
  • std::cout & 换行& std::cin的练习使用:
#include<iostream>
int main()
{
	int i = 10;
	i << 5;
	double d = 1.1;


	std::cout << i;
	//流插入,将i类型的对象转换成字符串插入到cout中

	std::cout << i << " " << d;
	//可自动识别类型,任何变量,都转换成字符串插入到流中


	//换行的两种方法
	std::cout << "hello"<<'\n'<<"\n";//该方法不会刷新缓冲区
	std::cout << "world " << std::endl;//该换行会刷新缓冲区
	
   //std::cin的使用
	std::cin >> i >> d;
	std::cout << i << " " << d<<std::endl;
	return 0;
}

在这里插入图片描述
但是如果我们每次写都要完整的写出std::cout和std::cin便会非常麻烦,这就可以根据namespace的使用特性2和3来解决

#include<iostream>
using namespace std;
//1.全局展开
//但还要注意这种方法只适用于日常小练习程序
int main()
{
	int i = 100;
	double d=1.1;
	cout << i<<endl;
	cin >> i >> d;
	return 0}
#include<iostream>
#include<algorithm>
//2.当然我们也可以选择部分展开
using std::cout;
using std::endl;
int main()
{
	int i = 100;
	double d=1.1;
	cout << i<<endl;
	cin >> i >> d;
	return 0}

在io需求比较高的地方,如大部分输入的竞赛题中,加上以下3行代码,可以提高C++IO效率

int main()
{
	ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

}

作为C++学习博客的开篇,内容以基础概念梳理为主,希望能帮刚入门的朋友搭好第一块学习基石。如果文中有表述不准的地方,或是你有更清晰的理解思路,强烈欢迎在评论区留言交流—— 技术路上多碰撞,才能更快进步

觉得内容对你有帮助的话,别忘了点赞+收藏,方便后续回顾复习;想跟着一起系统学习C++的朋友,也可以点击关注,下一期我们会聚焦更进一步的学习,带你从理论走进实操。下期不见不散

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐