首页 > 编程语言 >【C++高级编程】(一)C++速成

【C++高级编程】(一)C++速成

时间:2022-11-07 11:55:49浏览次数:51  
标签:std 1.1 int 编程 namespace C++ 速成 枚举

本章内容:

  • 简要回顾C++语言最重要的部分及语法

(主要讲述日常编程会遇到的最重要的C++部分,大佬快速浏览即可)


 1.1 C++基础知识

  • C++是基于C语言的超集,但这两种语言并不一样

1.1.1 小程序的"hello world"

//HelloWorld.cpp
#include<iostream>

int main()
{
    std::cout <<  "Hello world" << std::endl;
    return 0;
}
  1. 注释
    • 第一行是注释
    • 两种写法:两条斜杠开头(C++风格)或/**/包裹(C风格)
    • 注释仅供程序员阅读,编译器自动忽略不运行
  2. 预处理指令
    • 第二行是预处理指令
    • 预处理指令以#字符开始
    • include 指令首先告诉预处理器,提取<iostream>头文件中所有内容提供给当前文件,<iostream>头文件声明了C++提供的输入输出机制(没有此头文件,将无法执行输入输出文本)
    • 在C中,被包含的文件常以 .h 结尾,C++中标准库的头文件则省略了这一后缀
    • C中的标准头文件在C++中仍然存在,但换用了新名称(如<stdio.h>变成了<cstdio>)
  3. main()函数
    • main() 函数是程序的入口
    • main() 函数返回一个 int 值以指示程序的最终状态
  4. 输入/输出流
    • 可以将输出流想象为数据的滑槽,放入其中的任何内容都可以被正确的输出
    • std::cout 就是对应于用户控制台或标准输出的滑槽,还有其他滑槽,包括用于输出错误信息的 std::cerr 
    • std::cout 输出流可以在一行代码中连续输出多个不同类型的数据(std::cout << "文本" << 123;)
    • std::cin 输入流接受用户的键盘输入,但需慎重(永远不知道用户会输入什么奇奇怪怪的东西)
    • std::endl 代表序列的结尾换行,另一种换行符是:转义字符\n
      • \n  换行
      • \r  回车
      • \t  制表符
      • \\  一个反斜杠
      • \"  一个引号

1.1.2 命名空间

using namespace std;
  1. :: 被称为作用域解析运算符
  2. 命名空间用来处理不同代码段间的名称冲突问题(如:第三方库中有Func()函数,而自己也写了Func()函数,就可以把自己写的放进 namespace mycode{ Func(){} },从而调用 mycode::Func(); )
  3. 使用 using 指令避免预先指明命名空间,使用 using namespace mycode,就可以直接调用 Func(); 
#include<iostream>
#include"namespace.h"
namespace mycode
{
    int A = 0;
    void Func()
    {
        std::cout << "Func()" << std::endl;
    }
}

//将Func()函数放进命名空间之后,就与第三方库函数Func()区分开来,可调用:
mycode::Func();
mycode::A;

上面代码等价于:

#include<iostream>
#include"namespace.h"
using namespace mycode
{
    int A = 0;
    void Func()
    {
        std::cout << "Func()" << std::endl;
    }
}

//将Func()函数放进命名空间之后,就与第三方库函数Func()区分开来,可调用:
Func();
A;

 

一个源文件中可以包含多个 using 指令,此方法虽然快捷,但不要过度使用

  1. 使用整个命名空间:using namespace [name];
  2. 使用命名空间中的变量:using [name]::[variable];
  3. 使用默认命名空间中的变量:::[variable];

 

1.1.3 变量

  1. 声明变量时,可以不指定值(未初始化的变量通常被赋予一个半随机值,bug)
  2. C++中常见变量类型:
int a;
short b;
long c;
long long d;

// unsigned 对上面类型加以限制,使之为正数
unsigned int aa;
unsigned short bb;
unsigned long cc;
unsigned long long dd;

//浮点型(单/双精度)
float e = 3.14f;
double f;
long double g;

//字符型(单个字符,单个16位字符,单个32位字符,单个宽字符)
char h = 'm';
char16_t h1 = u'm';
char16_t h2 = U'm';
wchar_t h3 = L'm';

//布尔型,结果返回 true / false
bool i = true;

//auto 编译器自动判断类型
auto j = 10;  //应该为int型
  • C++没有提供基本的字符串类型,但作为标准库的一部分提供了字符串的标准实现

 

3. 三种显式转换变量类型:

bool IfBool = (bool) IfInt;
bool IfBool = bool(IfInt);
bool IfBool = static_cast<bool>(IfInt);
  • 在某些环境中,可以自动执行类型转换 / 强制转换
  • 但有时,自动类型转换存在潜在的数据丢失(如:float 转换为 int 会丢失小数部分)

 

1.1.4 运算符

  1. 如果记不住C++运算符的优先级,建议使用括号将表达式分组

 

1.1.5 类型

  1. 枚举类型
enum Color{red = 2,green,blue = 5,pink};
//默认情况下,所枚举元素第一个名称的值为0,第二个名称的值为1,第三个名称的值为2,以此类推。
//但此处,我设置了初始化值,默认情况下,每个名称都会比它前面一个名称大1,所以:red = 2,green = 3,blue = 5,pink = 6
Color pink;

 

2. 强枚举类型

上面给出的枚举并不是强类型的,这意味着其并非类型安全的,基本上会被当作整型数据 int 解释

enum class Color{red = 2,green,blue = 5,pink};
//Color 是一个类型安全的枚举,其枚举值不会自动转换为整数,枚举名称不会自动超出封闭的作用域
  • 默认情况下,枚举值的基本类型是整型

 

3. 结构

结构允许将一个或多个已有类型封装到一个新的类型中

Struct Student{
    string Name;  //学生姓名
    int age;  //学生年龄
    int score;  //学生分数
};

 

1.1.6 条件

1. if / else 语句

if(){}
else if(){}
else{}
//()圆括号内的结果必须是布尔值

 

2. switch 语句

switch(){
    case 1:
        //执行代码
        break;
    case 2:
        //执行代码
        break;
    ....
    default:
        //执行代码
        break;
}
//如果省略 break ,将会无视case判断,直接执行后面的代码

 

3. 三元运算符

(i = 0) ? 1 : 2;
// 判断括号内是否正确,正确返回1,错误返回2
//相当于 if(i = 0){ return 1; } else{ return 2; }

 

1.1.7 循环

1. while 循环

while(){ //执行代码; }

 

2. do / while 循环

do { //执行代码; }
while();

 

3. for 循环

for(int i=0; i; i++){ //执行代码; }

 

4. 基于区间的for循环

int arr[] = {1,2,3,4};
for(auto &i : arr){ i+=2; }

 

 

 

 

 

 

 

1.2 深入研究C++

 

 

 

 

 

 

 

 

 

 

 1.3 作为面向对象语言的C++

 

 

 

 

 1.4 标准库

 

 

 

 

 

未完待续.....

标签:std,1.1,int,编程,namespace,C++,速成,枚举
From: https://www.cnblogs.com/ZWJ-zwj/p/16864825.html

相关文章

  • 012 Rust 异步编程,在 async 块中使用?
    在Rust异步编程中能否像在同步编程中一样使用问号呢?我们来试试。示例源码[dependencies]futures="0.3"配置文件usefutures;asyncfnfoo()->Result<(),String>{"f......
  • 013 Rust 异步编程,Send trait 相关
    asyncfnFuture是否为Send的取决于是否在.await点上保留非Send类型。编译器尽其所能地估计值在.await点上的保存时间。示例源码usestd::rc::Rc;#[derive(Default)]struct......
  • 011 Rust 异步编程,返回错误
    在Rust异步块中,当发生返回错误的时,会是怎么样的呢?本节就这个知识点进行讲解。示例源码usefutures;asyncfnfoo(){"foo"}fnmain(){futures::executor::block_on......
  • 010 Rust 异步编程,使用 select 宏的条件
    使用select宏select中使用的Future必须实现Unpintrait和FusedFuturetrait。必须实现unpin的原因是,select中使用的future不是按值获取的,而是按照可变引用获取的,通过不获取f......
  • 009 Rust 异步编程,select 宏中的使用 default 和 complete
    说明在前一节,我们简单介绍了select宏。其实在select宏中,还可使用default和complete,前者表示没有分支完成,而后者则表示所有的分支都已经完成并且不会再取得进展的情况。示例......
  • 008 Rust 异步编程,select 宏介绍
    select宏select宏也允许并发的执行Future,但是和join、try_join不同的是,select宏只要有一个Future返回,就会返回。示例源码usefutures::{select,future::FutureExt,pin_mut......
  • 007 Rust 异步编程,通过 join 执行 Future
    前言在之前我们主要介绍了通过await和block_on执行Future,但是这两种方式实际上都是顺序执行的方式。.await是在代码块中按顺序执行,会阻塞后面的代码,但是此时会让出线程;block......
  • 006 Rust 异步编程,Stream 介绍
    Stream介绍​​Stream​​​和​​Future​​​类似,但是​​Future​​​对应的是一个​​item​​​的状态的变化,而​​Stream​​​则是类似于​​iterator​​​,在结束......
  • 005 Rust异步编程,Pin介绍
    为了对Future调用poll,需要使用到Pin的特殊类型。本节就介绍一下Pin类型。异步背后的一些原理例子1源码//文件src/main.rsusefutures::executor;asyncfnasync_function1()......
  • Rust 编程中使用 leveldb 的简单例子
    前言最近准备用Rust写一个完善的blockchain的教学demo,在持久化时考虑到使用leveldb。通过查阅文档,发现Rust中已经提供了使用leveldb的接口。将官方的例子修改了下,能够运行通......