C++入门(1)

在之前的学习中,我们已经掌握了 C 语言和数据结构初阶,对编程语言有了初步的认识与见解。如今迈入 C++ 的大门,相信不少同学都满怀热情与好奇。不过,要想真正写出C++程序,并对其有一个清晰的认识与理解,我们还需要先补充一些前置知识。

C++ 的命名空间

C++ 环境是兼容 C 语言的。

在 C 语言中,我们命名一个变量如果和库函数中函数名重复,就会引发重定义错误,比如 rand,当我们没有引入头文件 <stdlib.h> 的时候,编译是通过的。

但当我们引入该头文件 <stdlib.h> 时,就会出现重定义问题,该头文件中包含一个 rand 函数,编译器不清楚 rand 究竟是该函数名还是我们自己定义的变量 rand。g)

但当我们引入该头文件<stdlib.h>时,就会出现重定义问题,该头文件中包含一个rand函数,编译器不清楚rand究竟是该函数名还是我们自己定义的变量rand。

为了解决这种命名冲突,C++ 中引入了关键字 namespace。dnimg.cn/direct/88c567d9f需要用到关键字 namespace,使用方法为 namespace + 命名空间名 + { };中大括号中可以定义类型、变量、函数。# namespace的定义

  • 定义命名空间,需要用到关键字namespace,使用方法为namespace+命名空间名+ { }; 大括号中可以定义类型,变量,函数。
cpp 复制代码
namespace a
{
	int rand = 0;
};

a就是该命名空需要我们使用作用域解析运算符 :: ,让编译器去该作用域内去查找。,通常编译器会先去局部域里找变量名字,找不到再去全局域里面查找,并不会主动地去命名空间域里查找,需要我们使用作用域解析运算符'::' ,让编译器去该作用域内去查找。

  • 这就是命名空间域的用法,它一般是为了解决全局域 的命在项目工程中的不同文件中可以定义名字相同的 namespace,但在同一项目下同名 namespace 会被展开成同一个 namespace,所以不同文件中的同名 namespace 下不能定义同名变量 ,会有命名冲突问题。7b比如说我在 main.h 头文件中定义了命名空间 namespace a,object.h 中也定义了命名空间 namespace a,然后在源文件 main.cpp 中包含了这两个头文件: namespace b
    {
    int rand = 1;
    };
    namespace c
    {
    int rand = 2;
    };
    };

    • 在项目工程中的不同文件中可以定义名字相同的namespace,但在同一项目下同名namespace会被展开成同一个namespace,所以不同文件中的同名namespace下不能定义同名变量,会有命名冲突问题。

    比如说我在main.h头文件中定义了命名空间namespace a,object.h中也定义了命名空间namespace a,然后在源文件main.cpp中包含了这两个头文件:


    我们重复定义了rand,报错了。

    命名空间的使用

    C++定义的标准库都放在一个叫std的命名空间里面。
    我们上面说到,编译器通常只会去局部域和全局域里面去查找对象名,所以需要我们指定命名空间域去访问(推荐)。如果命名空间中的某个成员频繁被访问而且不会产生冲突,我们通常会用using把这个成员展开到全局域中。

    cpp 复制代码
    namespace st
    {
        int a=3,b=4;
    };
    //将st中的成员a展开到全局域中
    using st::a;
    
    int main()
    {
       //不需要我们用::来指定访问,编译器可以找到
       printf("%d\n",a);
       return 0; 
    }

一般不建议将一个命名空间全部展开,不然会很危险,但是为了方便,日常练习中可以全展开。

cpp 复制代码
//将标准库全展开
using namesapace std;

C++的输入&输出

  • < iostream >是Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。

  • std::cin 是 istream 类的对象,它主要面向窄字符(narrow characters (of type char))的标准输入流。

  • std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流。

  • std::endl是一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区。

  • <<是流插入运算符,>>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)

  • 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型,其实最重要的是C++的流能更好的支持自定义类型对象的输入输出。

  • cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去用他们。

  • 一般日常练习中我们可以using namespace std,实际项目开发中不建议using namespace std。

  • 在vs系列编译器中,我们没有包含<stdio.h>,也可以使用printf和scanf,在包含< iostream >间接包含了。其他编译器可能会报错。

我们来上手使用一下。

先包含头文件< iostream >,然后using namespace std将标准库展开(练习)。

使用cin、cout方法如下:

cpp 复制代码
#include<iostre# 第一个 C++ 程序
纪念一下第一个 C++ 程序。

int ma#include <iostream>
using namespace std; >> a >> b;
	cout << a << ' '<< b<< endl;
	return 0;
}

简单来说,cin 是流提取符,作用相当于scanf,cout是流插入符,作用相当于pirntf,endl效果相当于'\n',但是它会刷新缓冲区。

cin/cout和scanf/printf相比的好处在于,它们都可以自动识别对象类型(int、double、字符串),不需要使用占位符,支持单行或者多行输入。

第一个C++程序

纪念一下第一个C++程序。

cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
     cout << "hello world!" << endl;
    	return 0;
}
相关推荐
晴天的雨.9921 小时前
[C++算法]快乐数
数据结构·c++·算法
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之定制登录页
java·开发语言·spring
霸道流氓气质1 小时前
Spring AI vs Spring AI Alibaba:技术选型与平滑迁移策略
java·人工智能·spring
影视飓风TIM1 小时前
C++11 核心新特性完整梳理
数据结构·c++·算法
艾莉丝努力练剑1 小时前
【AI大模型接入SDK】Ollama本地大语言模型部署
c++·人工智能·语言模型·自然语言处理·面试
晴天的雨.9921 小时前
[C++]算法双指针 复写0
数据结构·c++·算法
拽着尾巴的鱼儿1 小时前
Idea:Cannot Run Git 无法运行git
java·git·intellij-idea
编程_大白1 小时前
IDEA配置SQL方言
java·sql·intellij-idea
橘子汽水1681 小时前
Leetcode 128,49最长连续序列,字母异位词分组
java·算法·leetcode