【C++】C++入门详解 I【C++入门 这一篇文章就够了】(上)

简介: 【C++】C++入门详解 I【C++入门 这一篇文章就够了】

前言

C++ 就是在对 C语言使用中遇到的缺陷与不足的改进。

C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助。

本章节主要目标:

  1. 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等。
  2. 为后续类和对象学习打基础


一、C++关键字(C++98)

C++总计63个关键字(涵盖 C语言32个关键字)



二、命名空间 namespace

(一)namespace的出现

在C/C++中出现的问题:

  1. 变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突
  2. 写的变量名与库里面的名冲突
  3. 在项目异步进行时,最终项目合并时,也容易导致很多命名上的冲突(重命名)

如下面这个例子

#include <stdio.h>
#include <stdlib.h>        //包含rand()函数
int rand = 10;             //全局变量中也有 命名为rand的变量
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
 printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”
  • C++ namespace[ 关键字 ] 对此进行了优化:
    平时程序运行中 默认访问全局变量里的变量namespace相当于一堵围墙平时都会绕开,默认不会进入墙里找域访问 。只有 展开命名空间,才有权限进入命名空间内访问存放的变量。


使用 namespace 后

#include <stdio.h>
#include <stdlib.h>        //包含rand()函数
namespace nini{
int rand = 10;             
}
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
 printf("%d\n",nini::rand);   // :: 域作用限定符 
return 0;
}

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染

namespace 关键字的出现就是针对这种问题的。



(二)namespace的定义

(1)namespace 的正常定义

namespace[关键字] + 命名空间的名字 + { } +( { } 里面 )命名空间的成员

  1. 一般开发中是用 项目名字命名空间名
  2. 命名空间中可以定义 变量 / 函数 / 类型(如结构体等)

[ 注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中 ]

namespace nini
{
 // 命名空间中可以定义变量/函数/类型
 int rand = 10;                        //变量
 int Add(int left, int right)          //函数
 {
 return left + right;
 }
struct Node                            //类型
 {
 struct Node* next;
 int val;
 };
}



(2)namespace的功能特性

1. 命名空间 可嵌套
// test.cpp
namespace N1
{
int a;
int b;
int Add(int left, int right)
 {
     return left + right;
 }
namespace N2
 {
     int c;
     int d;
     int Sub(int left, int right)
     {
         return left - right;
     }
 }
}
2. 同一工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个

// test.h
namespace N1
{
int Mul(int left, int right)
 {
     return left * right;
 }
}



命名空间的使用

(1)加 命名空间名称 及 :: 作用域限定符 [ 每次指定命名空间 ]

int main()
{
    printf("%d\n", N::a);    // :: 作用域限定符 【指定命名空间】
    return 0;    
}


☆(2) using 将 命名空间中某个成员 引入 [ 部分展开 ]

using N::b;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;    
}


(3) using namespace 命名空间名称 引入 [ 全展开 ]

using namespce N;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;    
}


  • 关于 全展开部分展开 的讨论:
    对命名空间进行展开 [ 命名空间全展开 ] (3) 其实是一件很危险的事,直接展开,全部暴露,又有冲突的风险。 而 每次指定命名空间(1)又很不方便 。
    指定展开(2)就可以解决问题 。指定展开 常用的
using std::cout;
using std::endl;
int main(){
cout<<"hello world\n";
int a=10;
double b=11.11;
cout << a << endl << b << endl;
cout << a << endl << b << endl;
cout << a << endl << b << endl;
}



三、using namespace std

std命名空间的使用惯例:

std 是 C++标准库 的命名空间,如何展开std使用更合理呢?

  1. 在日常练习中,建议直接 using namespace std 即可,这样就很方便。
  2. using namespace std 展开,标准库就全部暴露出来了,如果我们定义跟库重名的 类型/对象/函数 ,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像 std::cout 这样使用时指定命名空间 + using std::cout 展开常用的库对象/类型等方式。



四、C++ 输入&输出 [ IO流 ]

(一)代码实现

(1)包含头文件 # include<iostream>

  1. io _ int & out 的缩写 + stream 流 => iostream 输入输出流

后面使用cout,cin时,必须 包含< iostream >头文件 以及 按命名空间使用方法使用std

如下图


(2)cout cin endl

c(console 控制台)out,cin

  • cout 标准输出对象(控制台) [ linux 叫其 终端 ]

  • cin 标准输入对象(键盘)

cout和cin是全局的流对象。

  • endl [ endline 结束这一行 ] 是特殊的C++符号(C++换行符),表示换行输出

他们都包含在< iostream >头文件中。


(3)<< _ 流插入运算符,>> _ 流提取运算符


实际上 cout和cin分别是ostream和istream类型的对象>>和<<也涉及运算符重载等知识

这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有一个章节更深入的学习IO流用法及原理



(二)C++输入输出 的特性:可 自动识别变量类型

使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式

C++的输入输出可以自动识别变量类型

#include <iostream>
using namespace std;
int main()
{    
   //IO流
   // 可以自动识别变量的类型
   // << 流插入
   std::cout << "hello world";
   int a = 10;
   double b = 11.11;
            //int //字符串 //double //字符
   std::cout << a << "\n"<< b << '\n';
   std::cout << a << std::endl << b << std::endl;
   return 0;
}



(三)cout,cin更复杂的用法

关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度控制整形输出进制格式等等。

因为C++兼容C语言的用法所以,这种在C++的复杂用法,可以在C中用其基本语法来实现

int main(){
cout << "hello world\n";
int a = 10;
double b = 11.11;
cout << a << endl << b << endl;
printf("%.1lf\n",b);      //C++兼容C语言的用法,这种在C++的复杂用法,可以在C中用其基本语法来实现
}

这些又用得不是很多,我们这里就不展开学习了。后续如果有需要,我们再配合文档学习。



(三).h 头文件 以及 std命名空间

注意:早期标准库将所有功能 在全局域中实现声明在.h后缀的头文件中使用时只需包含对应头文件即可。

后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用 <iostream.h> + std 的方式。


目录
相关文章
|
1月前
|
安全 编译器 程序员
【C++初阶】C++简单入门
【C++初阶】C++简单入门
|
2月前
|
程序员 C++
C++模板元编程入门
【7月更文挑战第9天】C++模板元编程是一项强大而复杂的技术,它允许程序员在编译时进行复杂的计算和操作,从而提高了程序的性能和灵活性。然而,模板元编程的复杂性和抽象性也使其难以掌握和应用。通过本文的介绍,希望能够帮助你初步了解C++模板元编程的基本概念和技术要点,为进一步深入学习和应用打下坚实的基础。在实际开发中,合理运用模板元编程技术,可以极大地提升程序的性能和可维护性。
|
16天前
|
编译器 Linux C语言
C++基础入门
C++基础入门
|
1月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
25 5
|
1月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
49 4
|
1月前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
33 4
|
1月前
|
编译器 程序员 C语言
C++入门
C++入门
31 5
|
1月前
|
安全 编译器 C语言
C++入门-数组
C++入门-数组
|
1月前
|
存储 编译器 程序员
C++从遗忘到入门
本文主要面向的是曾经学过、了解过C++的同学,旨在帮助这些同学唤醒C++的记忆,提升下自身的技术储备。如果之前完全没接触过C++,也可以整体了解下这门语言。
|
1月前
|
存储 Serverless C++
【C++航海王:追寻罗杰的编程之路】一篇文章带你认识哈希
【C++航海王:追寻罗杰的编程之路】一篇文章带你认识哈希
11 0