C++基础总结

1.引用和指针区别

引用变量是一个别名,相当于定义了一个const类型变量,但不分配空间
引用定义时必须初始化,指针无要求
初始化时引用一个实体后不能再引用其他的,指针可以在任何时候指向任一同类型实体
没有NULL引用,有NULL指针
引用的sizeof结果为引用类型的大小,指针的sizeof结果为地址空间所占字节
有多级指针,没有多级引用
引用比指针使用相对安全 :(1)引用在定义时就与变量绑定了,而指针不一定,指针在定义后没有初始化就是[野指针(2)引用与被引用的变量是同一个地址,使引用不用进行地址操作,这样使地址是不可修改的,使访问更加安全。

2.内联函数

空间换时间的做法,省去函数调用和返回的开销,直接展开运行
适用被多次调用的函数,且函数代码较小没有包含循环、递归,否则会被编译器优化
声明和定义不分离
内联函数于#define的区别:
(1)内联函数在运行时可调试,而宏定义不可以;
(2)编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
(3)内联函数可以访问类的成员变量,宏定义则不能;
(4)在类中声明同时定义的成员函数,自动转化为内联函数。

3.代替宏

const修饰的变量为常量,在编译阶段替换
inline修饰的函数为宏函数

4.auto关键字

编译时根据初始化表达式推导auto的实际类型
auto 关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。

5.范围for

6.类

类是 C++ 的核心特性,用于指定对象的形式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IUNIbZVS-1661245035226)(cpp-classes-objects-2020-12-10-11.png)]
默认情况下,类的所有成员都是私有的
在类的外部使用范围解析运算符 :: 定义函数
访问修饰符:
public:在程序中类的外部是可访问的
protected:在类和友元函数和派生类(即子类)中是可访问的
private:只有类和友元函数可以访问
继承中的特点:

  1. public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private
  2. protected 继承::protected, protected, private
  3. private 继承::private, private, private

构造函数
构造函数的名称与类的名称是完全相同的,不会返回任何类型,可带参数,在每次创建类的新对象时执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ntuk5k0q-1661245035227)(屏幕截图%202022-03-20%20232811.png)]

析构函数:
析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,在每次删除所创建的对象时执行
有助于在跳出程序(比如关闭文件、释放内存等)前释放资源
拷贝构造函数
在创建对象时,使用同一类中之前创建的对象来初始化新创建的对象
拷贝构造函数通常用于:
通过使用另一个同类型的对象来初始化新创建的对象。
复制对象把它作为参数传递给函数。
复制对象,并从函数返回这个对象。

友元函数
类的友元函数是定义在类外部,声明在类内部,并不是成员函数
声明函数为一个类的友元,函数原型前使用关键字 friend
友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
this指针
每一个对象都能通过 this 指针来访问自己的地址。
在成员函数内部,它可以用来指向调用对象及成员
静态成员
不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化
静态成员函数只要使用类名加范围解析运算符 :: 就可以访问
静态成员函数和普通成员函数区别:

  1. 静态成员函数没有this指针,只能访问静态成员
  2. 普通成员函数有this指针,可以访问类中任意成员

7.继承

继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易,也达到了重用代码功能和提高执行效率的效果。
class derived-class: access-specifier base-class
派生类可以访问基类中所有的非私有成员
一个派生类继承了所有的基类方法,但下列情况除外:

基类的构造函数、析构函数和拷贝构造函数
基类的重载运算符
基类的友元函数

公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问

8.重载运算符和重载函数

在同一作用域中的某个函数和运算符指定多个定义
重载函数指声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同
重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。

// 重载 + 运算符,用于把两个 Box 对象相加
      Box operator+(const Box& b)
      {
         Box box;
         box.length = this->length + b.length;
         box.breadth = this->breadth + b.breadth;
         box.height = this->height + b.height;
         return box;
      }

9.多态

虚函数是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。

10.数据抽象,数据封装,抽象类

数据抽象: 接口和实现分离
如果改变底层实现,接口也将保持不变。在这种情况下,不管任何程序使用接口,接口都不会受到影响,只需要将最新的实现重新编译即可。
数据封装:数据和操作数据的函数绑定在一起
设置类成员状态为私有(private),除非我们真的需要将其暴露,这样才能保证良好的封装性。
抽象类: 类中至少有一个函数被声明为纯虚函数
使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口。然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。

10.文件和流

引用头文件fstream
ofstream输出文件流
ifstream输入文件流
fsteram文件流
成员:

打开:void open(const char *filename, ios::openmode mode);
关闭:void close();
重新定位文件位置指针 :seekg

写入文件:ofstream 或 fstream 对象 <<
读取文件:ifstream 或 fstream 对象 >>

11.异常处理

throw: 抛出异常
catch: 捕获异常
try: 检测try 块中的代码是否有异常
标准错误流cerr <<

#include <iostream>
using namespace std;
 
double division(int a, int b)
{
   if( b == 0 )
   {
      throw "Division by zero condition!";
   }
   return (a/b);
}
 
int main ()
{
   int x = 50;
   int y = 0;
   double z = 0;
 
   try {
     z = division(x, y);
     cout << z << endl;
   }catch (const char* msg) {
     cerr << msg << endl;
   }
 
   return 0;
}

通过继承和重载 exception 类来定义新的异常

12.动态内存

new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。
一维数组:

// 动态分配,数组长度为 m
int *array=new int [m];
 
//释放内存
delete [] array;

二维数组:

int **array
// 假定数组第一维长度为 m, 第二维长度为 n
// 动态分配空间
array = new int *[m];
for( int i=0; i<m; i++ )
{
    array[i] = new int [n]  ;
}
//释放
for( int i=0; i<m; i++ )
{
    delete [] array[i];
}
delete [] array;

三维数组:

int ***array;
// 假定数组第一维为 m, 第二维为 n, 第三维为h
// 动态分配空间
array = new int **[m];
for( int i=0; i<m; i++ )
{
    array[i] = new int *[n];
    for( int j=0; j<n; j++ )
    {
        array[i][j] = new int [h];
    }
}
//释放
for( int i=0; i<m; i++ )
{
    for( int j=0; j<n; j++ )
    {
        delete[] array[i][j];
    }
    delete[] array[i];
}
delete[] array;

13.命名空间

namespace namespace_name {
   // 代码声明
}
name::code;  // code 可以是变量或函数

使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称

14.模板

15.预处理

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值