C++学习笔记整理

c++ from 2019 10 20

C++学习

书:《 C++ primer 5th ed 》
排列较为混乱,但大体顺序基本正确,初学者可以参考此问安排学习内容。

C++简介

C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。

C:1940 ,面向结构,面向过程,代码太多后,管理很难,未解决软件危机。

C++被认为是一种中级语言,它综合了高级语言和低级语言的特点。它 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。编译器 操作系统 文字处理程序 大型游戏, 面向对象,进一步扩充和完善了 C 语言,最初命名为带类的C,后来在 1983 年更名为 C++。C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。

编译器实现的速度也让人惊喜 从开源的GCC、LLVM到专有的Visual C++和Intel C++。Code blocks DEV C++。集成IDE的编译器。

命令行编译 $ CC .\prog1.cc .\表示该文件在当前目录 查看状态可以键入 $ echo %ERRORLEVEL%

c++衍生JAVA C#模仿JAVA

c++最大的力量在于其不抽象 ,但能脱离C而存在,因为其强大的抽象能力, 4种编程风格 :C风格,基于对象,面向对象,泛型。

PS

  1. 软件危机(software crisis)
    是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象

  2. 对象:对象是指一块能存储数据并具有某种类型的内存空间。命名了的的对象叫做变量或者能被程序修改的数据,value指只读的数据

  3. 开源:开源软件的源代码任何人都可以审查、修改和增强 源代码 (source
    code)是程序员可以修改代码来改变一个软件的工作的方式,与之对应的是专有,闭源软件 proprietary or closed
    source。 早期的创造者基于开源技术构建了互联网的大部分 such as Liunx操作系统 everyone受益与开源软件。

  4. c++最大的力量在于其不抽象 ,但能脱离C而存在,因为其强大的抽象能力, 4种编程风格 C风格 基于对象 面向对象 泛型

  5. recommend book: 《Effective C++ concurrency in Action》《Linux多线程服务端编程 》

include

#include 预处理指令

  • iostream: input & output stream :有关输入输出的函数
  • .h文件还是存在在底层,亦如: 同<stdio.h>
  • **<>**里的是头文件 header 对于不属于标准库的头文件 用双引号“”来表示
  • 通常被定义在头文件中,而且类所在头文件的名字应该与类一样
  • 在cname的头文件中定义的名字从属于命名空间std 在名为.h的头文件中则不然
  • 预处理器是运行于编译过程之前的一段程序 预处理变量不属于命名空间std 由预处理器管理 无需加上std::,确保头文件多次包含仍能安全工作的常用技术是预处理器(preprocessor)
    C++还会用到一项预处理功能的是头文件保护符header guard。

PS

  • C++头文件保护符的使用方法和工作原理
    #ifndef A_H
    #define A_H
    …//头文件内容
    #endif
    头文件第一次被包含时,因为没有宏定义过“A_H”,因此经过语句

    #ifndef A_H
    #define A_H

    并得到执行后,“A_H”就被定义了,并且头文件的内容会进入编译,直到遇见“#endif”。而一旦该头文件即将被错误地包含第二次时,与语句“#ifndef A_H”不符,因为第一次你已经定义过“A_H”了,所以“#ifndef A_H”之后的语句不会进入编译了,直到遇见“#endif”。若头文件被包含一次以上,编译时都会报错。C++头文件保护符的目的就是避免这类错误。

Namespace

命名空间可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。
使用例子

#include <iostream>
using namespace std;
 
// 第一个命名空间
namespace first_space{
   
   void func(){
   
      cout << "Inside first_space" << endl;
   }
}
// 第二个命名空间
namespace second_space{
   
   void func(){
   
      cout << "Inside second_space" << endl;
   }
}
int main ()
{
   
 
   // 调用第一个命名空间中的函数
   first_space::func();
   
   // 调用第二个命名空间中的函数
   second_space::func(); 
 
   return 0;
}

<< 插入运算符

把右值插入stream中去

cout是打印 cin输入 cerr输出错误信息 clog输出一般信息。
控制cout的精度显示,强制以小数的方式显示 cout<<fixed;精度cout<<setprecision(2); setw() 设置宽度

endl是控制符manipulator 表示重起一行,强制前面的缓存显示,确保程序立即输出,效果是结束当前行,并将与设备关联的缓冲区buffer中的内容刷到设备中。

::作用域运算符

错误类型

syntax error(语法错误)
type error(类型错误)
delaration(声明错误)

编译过程

编译过程可以分为两个部分:编译和汇编

编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,源文件的编译过程包含两个主要阶段:

  • 编译预处理
    读取c源程序,对其中的伪指令(以# 开头的指令)和特殊符号进行处理。
  1. 宏定义指令,如# define Name TokenString,# undef等。

  2. 条件编译指令,如# ifdef,# ifndef,# else,# elif,# endif等。

  3. 头文件包含指令,如# include “FileName” 或者# include < FileName> 等。

  4. 特殊符号,预编译程序可以识别一些特殊的符号。

  • 编译、优化阶段
    经过预编译得到的输出文件中,只有常量;如数字、字符串、变量的定义,以及C语言的关键字,如main, if , else , for , while , { , } , + , - , * , \ 等等。

    编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。

  • 汇编
    汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。
    目标文件由段组成。通常一个目标文件中至少有两个段:

  1. 代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。

  2. 数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。

在这里插入图片描述
PS:
内存中如何存放数据?

  • 1Byte = 8 Bit
    1KB = 1024Byte = 210Byte
    1MB = 1024KB = 220Byte
    1GB = 1024MB = 230Byte
    1TB = 1024GB = 240Byte
    1PB = 1024TB = 250Byte
    1EB = 1024PB = 260Byte

    计算机可寻址的最小内存块称为 字节byte 存储的基本单元称为 字word
    大多数计算机的字节由8bit组成 字是4或8字节32或者64bit

数据类型

  • 算术类型 arithmetic type 和空类型 void
  • 整型 integral type 和浮点型
  • 数据尺寸 :
    bool 布尔类型
    char 8位
    wchar_t 宽字符 16位
    char16_t unicode字符 16位
    char32_t unicode字符 32位
    short 短整型 16位
    int 整型 16位
    long int 长整型 32
    long long int 长整型 64位
    float 单精度浮点数 6位有效数字
    double 双精度浮点数 10位有效数字
    char, signed char, unsigned char
    convert 类型转换
  • 枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
enum 枚举名{
    
     标识符[=整型常数], 
     标识符[=整型常数], 
... 
    标识符[=整型常数]
} 枚举变量;
    
  • 复合类型 compound type 引用和指针 references and pointers

  • typedef 声明
    可以使用 typedef 为一个已有的类型取一个新的名字。

typedef int feet;

PS:

  1. 变量声明declaration 和定义的关系definition
    extern int i; //声明而非定义 int j;//定义 extern int i =1;//定义
    变量只能被定义一次,但是可以被多次声明
    定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
    声明:用于向程序表明变量的类型和名字。含有extern
    定义也是声明:当定义变量时我们声明了它的类型和名字。
    函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明
  2. 名字的作用域 scope of a name 花括号分离 全局作用域global scope 块作用域 block scope
    嵌套作用域 内层作用域 inner scope 外层作用域 outer scope
  3. 类型说明符
    atuo类型说明符 必须有初始值
    decltype类型说明符 希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量 他的作用是选择并返回操作数的数据类型 decltype(f()) sum =x; //sum的类型就是函数 f 的返回类型

本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。

   class Box
{
   
   public:
      double length;   // 盒子的长度
      double breadth;  // 盒子的宽度
      double height;   // 盒子的高度
};

类的对象的公共数据成员可以使用直接成员访问运算符 (.) 来访问

   Box1.height = 5.0; 
   Box1.length = 6.0; 
   Box1.breadth = 7.0;

在这里插入图片描述

变量

由一个或多个连续的字节组成。在编程中,变量是用于保存数据的命名存储位置。变量允许程序员将数据存储到计算机内存中并使用其中的数据。它们提供对 RAM 的访问“接口”。
变量其实只不过是程序可操作的存储区的名称。C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C++ 是大小写敏感的。
float类型的存储
double类型的存储

变量作用域

在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用。下面的实例使用了局部变量:

#include <iostream>
using namespace std;
 
int main ()
{
   
  // 局部变量声明
  int a, b;
  int c;
 
  // 实际初始化
  a = 10;
  b = 20;
  c = a + b;
 
  cout << c;
 
  return 0;
}

全局变量
在所有函数外部定义的变量(通常是在程序的头部),称为全局变量。全局变量的值在程序的整个生命周期内都是有效的。
全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用的。下面的实例使用了全局变量和局部变量:

#include <iostream>
using namespace std;
 
// 全局变量声明
int g;
 
int main ()
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值