零星笔记

memset

是按字节操作的:
如果想在数组创建结束后再对其进行初始化,可以使用C函数memset(),但是memset的使用有个大问题,就是它只对char类型的数组管用:
char a[10];
memset(a, 1, 10);    // 将每个元素设置为1

如果将上面的a数组换成int或其他类型的,观察memset的内部实现是以字节为单位进行赋值的:
int a[10];
memset(a, 1, sizeof(a));
将只会对前sizeof(a)即40个字节进行赋值1的操作,即给10g个int赋值0x01010101的操作

初始化和赋值

对一个结构体赋值,st={1}:意味着将第一个元素赋值成1,其他初始化为0;
如果只声明一个结构体而不定义,则系统进行随机赋值。

float a[5] = {5,1};
==> a={5,1,0,0,0}

int a[5];//a中的元素是随机值int

int* a = new int[5]();
注意后面的一对圆括号,它的意思是使用默认值初始化整个数组,所以对于类类型来说,new string[5] 与 new string[5]()是等价的,都会调用默认构造函数进行初始化;但是对于基本类型就不同了,new int[5]根本不会初始化,而new int[5]() 则会使用int()的值即0进行初始化。

size_t : unsigned int 
time_t : long

 

跨平台宏定义

灵活使用也可以巧妙地帮我们输出非常用的调试信息
__FILE__ 包含当前程序文件名的字符串
__LINE__ 表示当前行号的整数 
__DATE__ 包含当前日期的字符串 
__STDC__ 如果编译器遵循ANSI C标准,它就是个非零值 
__TIME__ 包含当前时间的字符串
__FUNCTION__ 当前执行的函数
#include <iostream>

int main() {
    std::cout<<"date: "<<__DATE__<<" time: "<<__TIME__<<" file: "<<__FILE__<<" line: "<<__LINE__<<" function: "<<__FUNCTION__<<std::endl;
    return 0;
}

输出:
date: Nov 21 2019 time: 15:53:53 file: /root/CLionProjects/untitled/main.cpp line: 4 function: main

 

函数调用的过程

retType func (arg1,arg2);
参数2入栈;
参数1入栈;
开始调用,函数返回地址入栈;
开始执行,EBP指针(用于寻址的基址指针)入栈
MOV EBP,ESP;使寻址指针ESP和基址指针EBP相等
ESP移动,为分配局部变量分配空间
----------
起始堆栈<---ESP
----------
局部变量<---ESP=EBP-8h
----------
局部变量<---ESP=EBP-4h
----------
EBP        <---ESP=EBP-0
----------
返回地址<---EBP+4h
----------
参数1      <---EBP+08h
----------
参数2      <---EBP+0Ch
----------

 

静态成员变量:


所有成员函数都可以访问;
静态成员在该类中只有一份内存,即该类的所有对象共享该成员
只能在类外进行初始化(无需加static)
static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象时不能通过构造函数对其进行初始化
静态成员仍然遵循public,private,protected访问准则
静态成员必须在类外进行定义

静态成员函数的特性:
静态成员函数是类中的特殊的成员函数
静态成员函数没this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用
类的静态成员函数是该类共用的,与该类的对象无关,静态函数里没this指针,所以不能为虚函数
虚函数不能定义为内联函数:inline是在编译器将函数类容替换到函数调用处,是静态编译的。而虚函数是动态调用的,在编译器并不知道需要调用的是父类还是子类的虚函数,所以不能够inline声明展开,所以编译器会忽略
静态成员函数可以通过类名直接访问
静态成员函数可以通过对象访问
静态成员函数只能直接访问静态成员变量(或函数),而不能直接访问普通成员变量(或函数);但是可以通过对象间接访问。
静态成员函数不能返回非静态成员
使用类的成员函数创建线程时候,该成员函数必须是静态成员函数,但是这往往与我们多线程的初衷相矛盾,因此需要在类中定义一个静态成员函数用于创建线程,并且通过该静态成员函数传入this指针。

 

this指针的特点:


只能在成员函数中使用,全局函数和静态成员函数都不能使用this
this指针在成员函数开始前构造,并在成员函数结束后清除
this指针的存储位置跟编译器有关,可能是栈、寄存器或全局变量
this是类的指针
类的对象无法使用this指针,业务大知道this指针的位置,但是可以通过成员函数指定this指针的位置
虚函数会被放到函数表中,并会创建一个虚函数指针指向表头

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值