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、泛型无特化(自定义实现特定类型的处理),模板可以。