C++学习笔记

1. 数据类型

1.1 内置类型

bool、char、int、float、double、void、wchar_t

  • void:无类型
  • wchar_t:宽字符型,空间是和short int一样

1.2 类型修饰符

signed、unsigned、short、long

1.3 类型别名

typedef type newname;

1.4 类型转换

  • 静态转换(Static Cast):相似对象之间的转换,如:int转float。不进行运行时类型检查,可能会导致运行时错误。
  • 动态转换(Dynamic Cast):基类或派生类指针或引用。运行时进行检查,错误时返回空指针或抛异常。
  • 重新解释转换(Reinterpret Cast):将任意指针转换到其他指针类型,也允许任意整数类型和任意指针类型之间的转换。
  • 常量转换(Const Cast):将const类型对象转换为非const类型对象。

2. 变量类型

除内置数据类型,c++允许其它类型变量,如:枚举、指针、数组、引用、数据结构、类等。

3. 常量定义

  • 使用**#define**预处理器
#define identifier value
  • 使用const关键字
const type variable = value;

4. 类型限定符

  • const:定义常量,值不能被修改
  • volatile:变量的值可能会被程序以外的因素改变,如:硬件、其它线程
  • restrict:修饰的指针是唯一一种访问它所指向对象的方式

5. 存储类

  • auto:根据初始化表达式自动推断该变量的类型
  • register:定义寄存器变量,表示该变量被频繁使用,可以存储在CPU的寄存器中,非RAM,以提高程序运行效率,不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)
  • static:静态变量
  • extern:提供一个全局变量的引用,全局变量对所有的程序文件都是可见的
  • mutable:该类中的成员变量可以在const成员函数中被修改

6. 杂项运算符:

  • sizeof:返回变量大小
  • Condition ? x : y:三目运算符,如:sizeof(a) 将返回 4,其中 a 是整数
  • , :顺序执行一系列运算,整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值
  • .->:访问类、结构体的成员
  • Cast:把一种数据类型转换为另一种数据类型,如:int(2.2000) 将返回 2
  • &:返回变量的地址,如:&a; 将给出变量的实际地址
  • 指针: 指向一个变量,如:*var; 将指向变量 var

7. 循环

  • while:条件为真,执行循环
  • for:多次执行一个语句序列
  • do…while:条件为真,执行循环(循环至少执行一次)

8. 判断

  • if…else…
  • switch…case…

9. 函数参数

  • 传值调用:把参数的实际值赋给形式参数,修改形式参数对实际参数没有影响
void swap(int x, int y){
  int temp;
  temp = x; /* 保存 x 的值 */
  x = y; /* 把 y 赋值给 x */
  y = temp; /* 把 x 赋值给 y */
  return;
}
  • 指针调用:把参数的地址赋值给形式参数,修改形式参数会影响实际参数
void swap(int *x, int *y){
  int temp;
  temp = *x;    /* 保存地址 x 的值 */
  *x = *y;        /* 把 y 赋值给 x */
  *y = temp;    /* 把 x 赋值给 y */
  return;
}
  • 引用调用:把参数的引用赋值给形式参数,修改形式参数会影响实际参数
void swap(int &x, int &y){
  int temp;
  temp = x; /* 保存地址 x 的值 */
  x = y; /* 把 y 赋值给 x */
  y = temp; /* 把 x 赋值给 y */
  return;
}

10. 指针

10.1 操作符

  • &:访问当前变量的地址

  • *:返回位于操作数所指定地址的变量的值

10.2 详解

  • NULL指针:NULL 指针是一个定义在标准库中的值为零的常量
int  *ptr = NULL;
  • 指针的算数运算:可以对指针进行四种算术运算:++、–、+、-
int var[MAX] = {1, 2, 3};
int *ptr;
ptr = var; // 指针中的数组地址
ptr++; // 移动到下一个位置
  • 指针vs数组
int var[3] = {1, 2, 3};
for (int i = 0; i < 3; i++) {
  *var = i; // 正确语法
  // var++; // 错误语法
  *(var + i) = 10; // 赋值,有效语句
}
  • 指针数组:用来存储指针的数组
int main (){
  int var[3] = {10, 100, 200};
  // **ptr** 为一个数组,由3个整数指针组成。因此,ptr 中的每个元素,都是一个指向 int 值的指针
  int *ptr[3];
  for (int i = 0; i < MAX; i++){
  ptr[i] = &var[i]; // 赋值为整数的地址
  }
  for (int i = 0; i < MAX; i++){
  cout << "Value of var[" << i << "] = ";
  cout << *ptr[i] << endl;
  }
  return 0;
}
  • 指向指针的指针:一种多级间接寻址的形式,或者说是一个指针链,将指针的地址存放在另一个指针里面
int **var;
  • 传递指针给函数:引用或地址传递参数,使传递的参数在调用函数中被改变
  • 从函数返回指针:返回指针到局部变量、静态变量和动态内存分配。注意:不支持在函数外返回局部变量的地址,除非定义局部变量为 static变量

11. 引用

11.1 定义

  • 是某个已存在变量的另一个名字
  • 一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量
// r 是一个初始化为 i 的整型引用
int i = 17; int& r = i;

11.2 指针vs引用

  • 不存在空引用。引用必须连接到一块合法的内存
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。

11.3 使用

  • 引用作为参数
void swap(int& x, int& y);
  • 引用作为返回值:返回一个对局部变量的引用是不合法的,可以返回一个对静态变量的引用
int& func() {
  int q;
  // return q; // 在编译时发生错误
  static int x;
  return x;  // 安全,x 在函数作用域外依然是有效的
}

12. 结构体

struct TypeName {
  type1 name1;
  type2 name2;
   …  …
  }object_names;

13. 类

13.1 访问修饰符

  • public:成员在程序中类的外部是可访问的
  • private:成员变量或函数在类的外部是不可访问的
  • protected:与私有成员十分相似,但是成员在派生类(即子类)中是可访问的

13.2 继承

  • 支持多继承

13.3 重载

  • 重载函数:相同方法名,参数和实现不同
  • 重载运算符:重定义或重载大部分 C++ 内置的运算符,operator为关键字
Box operator+(const Box&);

13.4 多态

  • 继承中,多个子类的不同实现

13.5 虚函数

  1. 在基类中使用关键字virtual声明的函数
  2. 在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数;在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定
  • 纯虚函数:在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是在基类中又不能对虚函数给出有意义的实现
// = 0 告诉编译器,函数没有主体,是纯虚函数
virtual int area() = 0;
  • 接口/抽象类
    • 为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用
    • 如果试图实例化一个抽象类的对象,会导致编译错误
    • 如果一个 ABC 的子类需要被实例化,则必须实现每个纯虚函数
      #14. 异常处理
  • throw: 当问题出现时,程序会抛出一个异常
  • catch: 在您想要处理问题的地方,通过异常处理程序捕获异常
  • try:try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块

15. 命名空间

  • namespace
namespace name { code }
name:: code

namespace name_1 {
  namespace name_2 { code }
}
  • using
using namespace name;
using name:: code;
using namespace name_1:: name_2

16. 模板

  • 函数模板/泛型
template <typename type> ret-type func-name(parameter list) {
  // 函数的主体
}
template <typename T>
inline T const& Max (T const& a, T const& b) { 
return a < b ? b:a; 
}
  • 类模板
template <class type> class class-name { }
template <class T>
class Stack { 
  private: 
    vector<T> elems;  // 元素 
  public: 
    void push(T const&); // 入栈
    void pop();  // 出栈
    T top() const; // 返回栈顶元素
    bool empty() const{  // 如果为空则返回真。
      return elems.empty(); 
  } 
}; 

[注]:C++关键字查阅:https://www.runoob.com/w3cnote/cpp-keyword-intro.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值