diary-20221119
1b976670f28fce93497a5e34b31c94ab63562e82541e2487cf916ed3abbd96a45201f46129215def73a77614371f6950028843cf6a7b93a8ffe1fb4417d25fc77c4ccd9a4124794df1ea5fb8a9d826b57c4ccb939b0225db796640dbb01a8493ce09adaec6620eaf53a5eeb82967888ae42c0d7448ed2713ec4f816d36872cee6ad7a01f1aca461c061b16c323bbeabfa8d65bb689d8ec836840cd7ad5a2b50c06c114b9b5936c8da3ce43d9c502d19ef4b5aff19ccf24349b6439a0bb3571984f60a196b018e675c81b207f938357a9a6aa186ccf0b169ff92109a4eda81d81edfd0cb66d7a7eb8dd24bc7ce215704d664614b9e695c87fd ...
类的特殊成员
类的特殊成员1.静态成员
2.友元
3.常量成员
静态成员静态成员在类中分为静态数据成员和静态函数成员
静态数据成员静态数据成员的创建方式如下:
1234567class A{public:static int a;}//注意初始化格式int A::a=5;//只能通过类外初始化或者类内公有函数初始化。
说明:
①静态数据成员作用于类内,存储在内存的静态全局区上,所以它的生命周期的开始早于主函数。
②静态数据成员无法在定义时初始化,只能通过类外初始化或者类内公有函数初始化。(有资料说能在类内重新赋值,我不理解)
③静态数据成员属于类,不属于对象,但是可以公有属性的静态数据成员可以被对象在类外访问。
④静态数据成员生命开始早于对象,当然可以被类内其他成员函数使用。(得符合访问属性)
静态函数成员静态数据成员的创建方式如下:
12345678class A{public:static int a;static void func();}void A::func(){ //只能使用静态数据成员、局部变量、形参等等,不能使用类内其他数据成员或 ...
拷贝构造函数
拷贝构造函数拷贝构造是特殊的构造类型,也会影响类内是否会创建默认构造函数。
单纯只有拷贝构造也可以创建对象。
静态数据成员无法在类内初始化,只能在类外(main函数内也不行,得在静态全局区),但可以通过相应对象的接口进行赋值。
拷贝构造是一种通过自身类型来构造自身的构造函数,用户可以自定义拷贝构造,系统会默认给出:
12345class student{ public:int a=2;}student stu1;student stu2=stu1;
这里系统给出了一个默认拷贝构造,把stud1的数据成员一个一个地赋值给stu2;
创建方法:123456class student{ public:int a=2; student(const student& stu){ this->a=stu.a; }}
注意:①函数名与类名一致
②参数必须是本类型的一个引用变量
③因为只是复制,加上const保险一些
调用时机一、用同类 ...
C++第四次学习
对象的相关知识1.面向对象
2.类与对象
3.对象的生命周期
面向对象面向对象的方法就是将数据与行为结合在一起,共同表达一个对象,通过对象解决问题。
面向对象的特点:①封装性:对象内数据私有化,提供公有属性的接口以访问数据
②继承:对象可以派生出一个新的对象,有限制的继承原有对象的数据和接口。
③多态:面向对象的核心,实现同一个接口,不同的实例可以实现不同的操作。
优点:高内聚,低耦合
类与对象类我们都使用过基本数据类型,类就是自定义的数据类型。与C语言的结构体不同,在C++中,这些新的数据类型不仅可以存数据,还可以内置接口,存在访问控制。
类的定义:
1234567class A;//事先声明可要可不要class A{ public: int a; int add(){return 0;};};//定义,要加分号
类的访问控制:
public:类内类外都可以访问
protected:类内和派生类可以访问
private:只有类内可以访问
this指针:
this指针作用在类内,始终指向实例化的对象。
与->运算符连用
对象对象 ...
C++ 第三次学习
C++ 第三次学习1.new和delete动态分配内存
2.命名空间
3.cin和cout
4.string类的基本运用
动态分配内存之前c语言时,动态分配内存是通过malloc()和free()等等函数完成的
123//void *malloc(size_t size);int* p=(int* )malloc(sizeof(int)*num);//malloc()括号内为字节数。//relloc()是重新分配内存,这里存在判定,如果原来的空间够用(后面的使用),则不会分配,函数返回原来内存的指针;如果不够用,则会执行重新分配,并将原来数据复制过去,返回新内存的首地址。
new的基本用法:123type* var_name=new type;type* var_name=new type(1);//分配一个并初始化。在类的相关内容中,这里还意味着调用构造函数进行初始化。type* var_name=new type[5];//连续分配,注意要使用memset()函数初始化
memset()函数初始化:12int* p=new int[5];memset(p,0,20);//对首地址 ...
C++ 第二次学习 bool...
C++ 第二次学习1.Bool类型
2.内联函数
3.引用
4.函数重载与参数缺省
Bool类型1.独属于c++的逻辑类型
2.取值为true或false,但在控制台输出为1/0
3.定义方式 (与基本类型类似)Bool istrue =1;
4.内存大小占用1字节
内联函数 内联函数是程序员对编译器提出的一个建议,建议编译器在编译程序代码的时候,把该函数的代码 内嵌到程序代码中具体调用该函数的位置,将这个函数放在代码区,调用时不再进出栈区,由此提高程序执行效率,节省栈区空间。但是具体是否内联成功,还是要由编译器决定。
内联函数的关键字为 inline ,将关键字放在所要内联的函数的定义之前,注意,是定义,放在声明前是没意义的。
不是所有函数都适合内联的,一般我们将要重复调用并且函数代码简单(一般不超过10行)(简单运算或者赋值)设置为内联函数。此外,还有一些补充点: ①内联函数中不建议使用循环或者开关语句,这样有违内联函数初衷,会导致代码膨胀,有些编译器会报错,有些不会。
...
混淆点:栈、堆
首先,程序都是在内存中运行的,故而堆栈都处在内存里。
内存中包括:栈区、堆区、静态、静态存储区、文字常量区、程序代码区五个
其中:
!()[“C:\Users\14742\Desktop\blog\public\img\内存五区.png”]
1.栈区:执行函数的时候,函数内部(包括main函数)的局部变量都在栈区创建,程序结束时由程序自动释放。
这种栈内存分配的相关运算是由cpu的寄存器来存取的,效率高,但分配空间有限(但不是分配在寄存器上,别混淆,寄存器只是一个媒介),只有几MB,可以通过编译器选项修改。
2.堆区:
堆区就由程序员手动分配的存储区,使用malloc(),new等函数分配,free delete等函数释放,优点是灵活,代价是容易被程序员遗忘释放操作。未释放的内存在程序结束时由系统收回。
3.静态区/全局区/全局静态区/静态全局区:
细分为:data区,bbs区,常量区
①全局变量和静态变量是放在一起的。
②初始化的全局变量和静态变量放在一个区:data segment
③未初始化 的放在相邻的另一个区: bss(block started by ...
vim及gcc
n:nextstd:standard:标准h:head:头部include:包含,包括main:主要的,最重要的,入口print:打印format:格式printf=print format=按照一定的格式进行打印输出return:返回,结束i:input:输入o:output:输出
回顾:1.计算机组成部分 硬件 三大件 CPU 数据运算和操作外设 内存 暂存数据,速度快,容量小 硬盘 永久性存储数据,速度慢,容量大 外设 可有可无 软件 操作系统 驱动控制外设,分配CPU资源和内存资源等 shell终端程序 接收用户输入的命令并且执行命令 应用程序 QQ等
2.主流操作系统 windows/linux/苹果/安卓/vxworks
3.linux系统的发展 开源/1991/linus/视频:the code linux/www.kernel.org(官网) ...
运算符继续
复习:
逻辑运算符的短路算法
1.位运算
位与::&
位或:|
位异或:^
位反:~ 注意前面的好多0也要取反
1234~0x5a (一个int下):0xffffffa5如果我不想看到那么多f怎么办呢unsigned char a=~0x5a;//将4字节的0xffffffa5保存到变量a中,其他的f全部丢失 这里由于明显除去f的是非负数,所以用unsigned char 就可以
2.移位运算符
a<<b //a左移b个位置,右边的空位用0补齐
a>>b //a右移b个位置
对于无符号类型数字:
左边空出来的空位用0填充
对于有符号类型的数字:
左边空出来的空位用符号位(原来数的符号)填充
左移n位相当于乘以2的n次方,右移类推
不要用乘除,效率低
123int a=8;a<<1;printf("%d",a);//a的值是不改变的,只是拿着a的值的副本去左移右移
注意:原本的数可能会出现不能被整除的情况,所以右移后的数不严格等于除以2的n次方的数
3.移位运算与位运算的结合
a)位清0操作
原理:通过某 ...
循环
1.{}是否独占一行,由公司的编码规范来定
比如:linux操作系统程序员规范是不独占一行
2.switch注意事项
switch(控制表达式){
case 常量表达式:…;
}
a)控制表达式被当成一个整数处理(int),可以是字符(本质还是单字节整数),但不能是浮点数或字符串
b)常量表达式必须是常量(例如:’a’,5,2+3),不能是变量,不允许有重复的case分支,分支结构只能是多选一
c)case分支或者default中如果定义变量,则要加{ },并且这个变量的作用域只在这个花括号内部
d)注意break的运用,不管是deafult还是case,后面没跟break的话,都继续向后执行
swithc…case实现的代码经过gcc编译器翻译的可执行程序代码量比if…else要少,所以switch…case代码执行效率高
但是switch…case在某些场合使用极其繁琐。而且限制多
3.循环结构
for ,while ,do…while