笔记(未整理)

C++

11.03
1、memset:初始化数组 {
    int v3[6];
    menset(v3,0,sizoof(v3));
}

2、字符数组当字符串使用需流出'\0'的空间(错误做法){
    char c[5] = { 'a','b', 'd', 'c', 'o' }
}

3、传入参数时,不会造成数组内容丢失
std::array<double,100> values{1,2}

4、static :
特性:
    类使用:生命周期和程序执行周期相同
    作用域只在初始化的函数中
    
    函数使用:(最开始初始化,且只初始化一次)
    (控制变量,只能在变量所在的文件内修改使用)
使用场景:
    程序需要知道之前的变量状态,使用static
    控制一个变量的作用域(缩小)
#include <iostream>
int v{ 0 };

int inc() {
    static int v{ 0 };
    return ++v;
}

int main() {
    std::cout << v << std::endl;
    std::cout << inc() << std::endl;
    std::cout << inc() << std::endl;
    std::cout << inc() << std::endl;
}

结果:
0
1
2
3

5、infactiveC++
    inline :解决程序短小,调用函数需要进站出站,函数调用代价大。
    inline用于替换函数,解决此问题
    
6、分治:为了将指数级别的耗时,降为log级别


0112
定义外部变量 extern

全局变量
static
include 头文件


strcpy 会cpy字符串结尾的 0 吗

看一下brush帮助文件
完成实现


写了定义没写实现,调用会出错吗

DRY don't repeat yourself

析构函数调用时机:遇到花括号,或者遇到delete

explicies

new 之后需要delete  new 和 delete关系
delete 释放new分配的单个对象指针指向的内存
delete[] 释放new分配的对象数组指针指向的内存
 · 对象象数组的时候,用delete[]来释放
 
this指针

pText = nullptr 判断指针状态


运算符重载

深拷贝:
潜拷贝:拷贝指针,指针指向的对象没有拷贝,会有俩个对象指向同一个地址,释放时会有数组越界

const:控制修改权限,加保护,constant:不变的
1、左结合
2、修饰指针指向的内容 (int const *p) --- 内容不可变
   修饰指针 (int *const p)--- 指针不可变
    
mutable:,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。
但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,
那么这个数据成员就应该被mutalbe来修饰。

friend : 有缘函数
对象数组
TRACE


聚合:整体部分,空心菱形,可以单独存在,生命周期可以不同
组合:实心菱形,不能单独存在。


·new 出来的对象是内存中的动态分配的堆内存heap,需要手动去delete释放。
    
面相对象:通过简单的功能组合实现复杂的功能
java 内部管理


内嵌类 : 
内部类 匿名内部类
使用场景?

运算符重载:++  equal 和 == 是不是利用了运算符重载
为什么new之后需要delete 构造方法创建不用delete
内涵 外延 演绎推理

按照功能定义接口,而不是根据实现定义接口

复数类:赋值运算符,比较运算符,complex类重载。

指针:使用malloc()free()来申请和释放?

· 组合关系体现的是“has-a”。继承关系体现的是“is-a”。

cin :
    先读取数据到缓存区,遇到tab 换行 空格结束读取
    rdstate()查看缓存错误类型。
    clear()清除缓存区状态。
    
    istream &ignore( streamsize num=1, int delim=EOF );
    cin.ignore(std::numeric_limits< streamsize >::max(), '\n');
    跳过输入流中n个字符,或在遇到指定的终止字符时提前结束
    (此时跳过包括终止字符在内的若干字符)。
    https://blog.csdn.net/cpp_learner/article/details/104178769
    

int *p//一级指针,
    表示p所指向的地址里面存放的是一个int类型的值
int **p//二级指针,表示p所指向的地址里面存放的是一个指向int类型的指针
    (即p指向的地址里面存放的是一个指向int的一级指针)
*p//取出指针p指向的值
&p//取出指针p的地址

值传递:形参是实参的拷贝,该笔形参的值不会改变外部实参的值
    (相当于开辟了新空间,将实参的值拷贝到新空间中进行操作)
地址传递:形参是指向实参地址的指针。
    当对形参的指向进行操作时,就是对实参本身进行操作
引用传递(&):形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作。
    在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,
    但是这时存放的是由主调函数放进来的实参变量的地址。
    被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。
    正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

总结一下指针和引用的相同点和不同点:
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:
●指针是一个实体,而引用仅是个别名;
●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
●引用不能为空,指针可以为空;
●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
●指针和引用的自增(++)运算意义不一样;
●引用是类型安全的,而指针不是 (引用比指针多了类型检查

自定义自变量:
double operator ""_km(long double kmv){return kmv * 1000}
double dis = 25.0_km;

返回值优化
析构函数的作用
const


动态分配的内存

·返回引用是为了能够连续赋值。

·srand((unsigned)time(null)) :获取系统时间(从1900开始),并作为srand的参数
    获取srand随机数种子,之后的rand()函数按照顺序获取种子中的数据。

·复制构造函数在以下三种情况下会被调用。

1) 当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用
2) 作为形参的对象,是用复制构造函数初始化的
3) 作为函数返回值的对象是用复制构造函数初始化 的,而调用复制构造函数时的实参,
   就是 return 语句所返回的对象.(编译器会优化RVO(return value optimization))

·DLL:各类程序的函数实现过程
好处:
    不需要再运行之初加载所有的代码,减小程序体积。
    程序可以实现模块化,由相对独立的组件组成。

·浅拷贝和深拷贝
浅拷贝:
    默认复制构造函数浅拷贝直接复制俩个对象间的指针成员,
导致俩个指针指向堆中的同一块区域
    一个对象修改导致另一个对象改变
    一个对象超出作用域,导致内存释放时,使另一个指针无效化。导致访问异常。
    
·底层:
指向堆的指针


问题:
1、变量的类型是怎么保存的
a是一个长度为4的字符数组,a是这个数组的首元素首地址。
既然a是地址,pa是指向数组的指针,那么能将a赋值给pa吗?
答案是不行的!因为a是数组首元素首地址,pa存放的却是数组首地址
,a是char 类型,a+1,a的值会实实在在的加1,而pa是char[4]类型的,
pa+1,pa则会加4,虽然数组的首地址和首元素首地址的值相同,
但是两者操作不同所以类型不匹配不能直接赋值,但是可以这样:
pa = &a,pa相当与二维数组的行指针,现在它指向a[4]的地址。

2、this用法:

3、c++内存管理
内存映像象图    内容    权限
栈区    函数中的普通变量    可读可写
堆区    动态申请的内存    可读可写
静态变量区    static修饰的变量    可读可写
数据区    用于初始化变量的常量    只读
代码区    代码指令    只读

4、二维数组传参

5、指针函数和函数指针
6、指针数组和数组指针
7、深拷贝和浅拷贝
extern "C"

._bstr_t  ._bstr_

枚举
winsock2

网卡问题
域名有多个ip映射

C++默认初始化值
int/float/double    0
char    ‘\0’
pointer    NULL

使用c实现面向对象

容器
容器分类:
    STL 对定义的通用容器分三类:顺序性容器、关联式容器和容器适配器。

标准容器类    特点
顺序性容器:
vector    从后面快速的插入与删除,直接访问任何元素
deque    从前面或后面快速的插入与删除,直接访问任何元素
list    双链表,从任何地方快速插入与删除
关联容器:
set            快速查找,不允许重复值
multiset    快速查找,允许重复值
map            一对多映射,基于关键字快速查找,不允许重复值
multimap    一对多映射,基于关键字快速查找,允许重复值
容器适配器:
stack        后进先出
queue        先进先出
priority_queue        最高优先级元素总是第一个出列

内联函数:
1、用关键字inline修饰,函数声明和定义的时候都要加上
2、内联函数是直接复制“镶嵌”到主函数中的,普通函数调用时,
是指令跳转到被调用函数的入口地址,执行完后指令在回到主函数上。
内联函数不需要指令跳转按照顺序执行
3、内联函数被调用几次,就被复制几次(类似与宏)
宏定义(#define):本质就是在预编译时期进行替换,而内联函数比宏定义高级。
    #表示:对应变量字符串化  
    ##表示:把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符
连接符#@:它将单字符标记符变换为单字符,即加单引号。例如:
    #define B(x) #@x
则B(a)即'a',B(1)即'1',但B(abc)却不甚有效。
4、利:避免指令间来回跳转:加快速度
弊:代码被多次复制,增加代码量,占用更多空间
5、使用场景:函数本身内容少;被频繁调用
6、递归函数不能使用内联函数(为什么?)
7、类内定义的函数都是内联函数(不用加inline)
7、函数声明在类内,函数定义(实现)在类外,看类外的函数实现有没有inline修饰符号
有就是内联函数。

模板和泛型的区别:
1、泛型的具体类型是在程序运行时确定的,模板的实例化是在编译时确定的
2、泛型无特化(自定义实现特定类型的处理),模板可以。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值