CPP知识点总结

关键字

  1. static
    参考博客.
    1)声明变量储存在静态区,默认值为0,
    2)保持变量内容的持久,声明周期同全局变量,但是可见范围和局部变量相似
    3)C++中的类成员声明static,类的静态成员函数/变量是属于整个类而非类的对象,静态成员函数仅能访问类的静态数据和静态成员函数,静态数据成员是静态存储的,所以必须对它进行初始化,静态成员为父类和子类共享。

  2. const
    修饰普通变量,表示常量。修饰普通函数参数,表示此参数是传入参数,不希望在函数内改变其值,参数类型常为指针或引用。修饰类的成员函数表示不能修改类的成员变量

  3. final
    禁用继承,禁用重写

  4. #define
    宏定义,简单的理解就是替换

面向对象

  1. 多态
    运行时多态: 真正的多态,通过虚函数实现,形象的说,同一操作作用于不同的对象,可以有不同的结果,运行时,可通过指向基类的指针,来调用实现派生类中的方法。
    编译时多态: 并不是真真的多态,如:函数重载(包括运算符重载)和模板实现
  2. 复制构造函数不允许传递值,只能通过传递引用方式。类的实例的私有变量可以在类中直接调用, 如复制构造函数:
    A(A& other)  { value = other.value;}
  1. 虚函数与虚函数表 参考文章1 参考文章2
    有虚函数的类A有一张虚函数表 c,虚函数表是一个指针数组用来指向函数地址,而A的每个实例对象就会有一个虚函数表指针*__vptr,指向vtbl。对象调用虚函数需要通过__vptr去访问vtbl,进而调用虚函数。当子类B继承A,那么B也会有一个虚函数表,父类的虚函数在子类的虚函数前面,当B中对A的虚函数进行覆盖重写时,覆盖的函数被放到虚函数表中原来父类虚函数的位置。
    多继承:
    在这里插入图片描述

2.浅拷贝和深拷贝
浅拷贝:把对象a里的值完全复制给b另一个对象,如果a对象中存在动态分配内存,其复制的只是将指针复制给另一个对象,实际上是指向同一个内存区域,当一个对象将内存释放(如:析构),另一个就成为野指针,运行出错,
深拷贝:当一个对象有资源,在复制时对进行资源的再重新给新构造对象分配,就是深拷贝。

string

1.指针常量初始化和常量内存初始化
常量字符串放在单独的内存区域,用几个指针常量初始化相同的常量字符串,实际上是都指向这个空间,

//现在好像不能这样声明了
 	char *str1 = “abc”;
	char *str2 = “abc”;//str1 == str2指向同一内存
	
	char str3[] = “abc”;
	char str4[]= “abc”;//str3 != str4

2.strcpy和strcopy_s
strcopy_s是安全版本存在于头文件< cstring>,接受两个参数或者三个,被复制的长度都不能超过
str的空间长度

注:strlen()求的长度不包含结束字符,所以复制时候应加上这个1

 	char* str1 = new char[20];
	char str[7];
	strcpy_s(str1, strlen("hello world")+1 , "hello world");  //三个参数,第二个为复制提供的长度,应该大于被复制的字符串
	strcpy_s(str,"hello");   //当被复制字符串长度小于等于str的长度才不会报错,不然报错
  1. C++中的string

STL

1.vector

vector<int> a;                       //声明一个int型向量a
vector<int> a(10);                   //声明一个初始大小为10的向量
vector<int> a(10, 1);      //声明一个初始大小为10且初始值都为1的向量
vector<int> b(a);                    //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3);//将a向量中从第0个到第2个(共3个)作为向量b的初始值

//直接使用数组来初始化向量:
int n[] = {1, 2, 3, 4, 5};
vector<int> a(n, n+5);       //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]); //将n[1] - n[4]范围内的元素作为向量a的初值

多线程

C++11提供了许多性的特征

  1. 关键字:
    auto
    自动推断变量类型,auto作为函数返回值时,只能用于定义函数,不能用于声明函数。
    nullptr:
    C++中不能把void*类型的指针隐式转换成其他类型的指针,NULL实际上是0。NULL代替0表示空指针在函数重载时会出现问题。nullptr这一新的关键字来代指空指针
  2. 多线程
    C++11提供了线程库 thread 用于创建线程 ,配合线程相关的库如:互斥量库mutex等。线程的通信。
  3. 智能指针内存管理
    更加安全的使用动态内存。解决两个问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指针引用内存的情况下就释放了它,就会产生引用非法内存的指针。
  4. 其他特性,如容器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值