C++基础笔记

1.函数和其他函数不属于同一类的问题

考察的是不是同一个库里面的函数或者用法是不是类似

补充知识:

Iseek函数用于在指定的文件描述符将文件指针定位到相应的位置,并返回该位置,适用于操作系统级的POSIX文件描述符。

fseek用于将文件读写指针移动到指定位置。

pread是系统调用。

snprintf属于stdion.h

strtok将字符串s按照delim制定的分隔符分解为一组字符串。

2.初始化列表问题

构造函数的初始化列表的规则:派生类可以直接在初始化列表里调用基类的特定构造函数向它传递参数;类的非静态const数据成员与引用成员只能在初始化列表汇中初始化,因为它们只存在初始化语义;类的数据成员的初始化方式有初始化列表和赋值初始化的方式,其中初始化列表效率会快些,赋值初始化会更清晰些。需要初始化列表中初始化的:类的非静态数据成员、常量(eg:const int b、float* &c)

3.16位机器

16位机器中,int变量占16位,首位是符号位

4.进程

定义进程:pid_t,其实就是int类型

fork()函数的特点调用一次,返回两次。当fork()函数执行成功时,当前进程P会创建一个新进程p1,P叫做父进程,p1叫做子进程。返回两次一次是在父进程P中,返回值是子进程p1的ID,另一次是子进程p1中,返回值为0。父进程P和子进程p1继续并发执行。

5.线程

6.C++中不允许对函数作嵌套定义。构成C++语言程序的基本单位是类。调用函数前不一定要定义,可以事先声明。

7.容器

STL容器没有规定一定是线程安全。使用时需要由程序员加锁来保证一致性;容量不够时,vector可以翻倍来扩展内存。std::sort当数据量大时,可以采用快速排序,数量中等可以堆排序,少量数据可以插入排序。std::string有长度字段,不以‘\0’为结束标志。std::bitset是记录0、1标志的容器,需要初始化指定长度。往往使用deque来实现堆栈std::stack

8.静态成员

用static修饰的数据成员为静态成员,静态成员被同类的所有对象共享,可以被类的所有方法访问。静态方法只能访问静态方法和静态成员。如果没有被const修饰,值可以修改。初始化需要在类外面进行。只有静态成员是const int类型,才可以在类内直接赋初值。静态数据成员显然可以被类内的函数对象使用;如果静态数据成员是public类型,在类外也可以被读写。静态数据成员和静态函数成员都收到private控制符的影响。

static_cast和dynamic_cast都是用于强制转换。其中,dynamic_cast在编译时继承树,所以编译时不会报错;static_cast编译器隐式执行的任何类型操作都可由它显示完成,比如基本类型,可以将int隐式转换成double,但是不能将int* 转成double*,对于用户自定义类型,如果两个类无关,则会编译出错,如果存在继承关系,可以在基类和派生类之间任意转换,编译期间不会出错。

9.成员函数

成员函数的代码存储在对象空间之外,成员函数是不属于对象的,而成员变量是属于对象的。虚函数需要有虚表指针,虚表指针只存在于对象中。

10.原子操作

原子操作是不可被中断的一个或一系列操作,原子操作在执行完毕之前不会被任何其他任务或者事件中断。在单处理操作器中,能够在单条指令中完成的操作都可以认为是“原子操作”,因为中断只发生在指令之间。如果一个操作包含多个CPU指令则不是原子操作。

eg:x++和++x都是内存中的x读到寄存器中,然后在进行+1操作,然后再到寄存器中将值赋给x,不是原子操作。而 x=1操作则是直接对内存进行赋值操作,是原子操作。

11.虚函数

被virtual关键字修饰的成员函数就是虚函数。它是用来实现多态性的,多态性是将接口与实现进行分离,也就是用不同的策略来实现相同的方法。构造函数不能声明为虚函数,虚函数对应一个vptr(虚函数表指针),可是vptr其实是存储在对象的内存空间的。如果对象是虚的,则需要通过vptr来调用。析构函数可以声明为虚函数,有的时候基类析构函数不是虚函数,派生类的析构函数不会被执行会导致内存泄漏。最好不要在构造函数里调用虚函数,否则类里面的变量可能还没有初始化,虚函数可能会访问内存中位置的区域产生错误。

虚函数需要虚表指针。

对象的析构过程是先析构派生类,然后析构基类;当在基类的析构函数调用虚函数时,往往派生类已经被析构,所以不会呈现多台。如果在基类的西沟函数中调用纯虚函数,编译器会报错。

12.rand()用法

随机数发生器,在库stdlib.h中。并不是真的随机数,用线性同余法做的,因为周期很长,可以看成随机的。返回数值在0-RAND_MAX间。每次执行都是相同的,要是不同,需要用初始化随机数发生器srand()来初始化,如果是有循序,srand()需要放在循环外面。

eg:srand((int)time(0));

      int cen = (float)rand()/(RAND_MAX+1)*len;

13.继承

基类和派生类

继承方式:public(子类可以访问private、protected)、private(父类变成private,子类可以访问public、protected)、protected(父类中的public和protected都是protected类型,但是private还是private)。无论以哪种方式继承,子类都不能直接访问到父类中的private。

14.sizeof

      32位系统,int字节大小都是4个字节,char字节大小为1,long long字节大小为8,而在str中,记得字符串结尾要加上‘\0’来表示字符串的结束的。如果对齐的话则需要是最大字节的整数倍。如果是联合体,则取它包含的所有元素的最大占用空间,为联合体内容占用空间。

      64位系统,int类型占8字节

参考文献:https://www.cnblogs.com/metalsteel/p/6280389.html

15.全局变量

在函数的外部定义的变量,因此也叫外部变量,不属于某个特定的函数,属于一个源程序文件,因此全局变量的作用域是整个源程序。说明符是extern,是隐含存储类型。

16.|

为按位或运算

17.存储区问题

static修饰符声明的变量为静态变量存储在静态空间的存储区,比如static float 定义的内部变量或者外部变量;全局变量存储在存储空间的静态存储区,比如 float定义的外部变量;局部变量存储在存储空间的动态存储区,比如float定义的内部变量。

18.构造函数和析构函数

析构函数和构造函数是一对,构造函数用于创建对象,析构函数用于删除对象。构造函数的形式有类的构造函数形式、带参数的构造函数形式等;析构函数与构造函数名称一样,只是前面加了个~,不会返回任何值,也不带参数。有助于在跳出程序前释放资源。如果类不是那么复杂,可以不用写析构函数,系统会自动帮我们写,若果是连接数据库、打开文件、动态分配内存等就是构造函数里有new这个关键词,我们就需要自己写析构函数。

eg:

class Line
{
public:
    void setLength( double len );
    double getLength( void );
    Line();  // 这是构造函数;
    ~Line();//这是析构函数声明;
private:
    double length;
};

// 成员函数定义,包括构造函数
Line::Line(void)
{
    cout << "Object is being created" << endl;
    
}
Line::~Line(void)
{

    cout << "Object is beding deleted" << endl;
}

定义对象时会自动调用钩子函数进行初始化。构造函数不能声明为虚函数,虚函数对应一个vptr(虚函数指针),可是vptr其实是存贮在对象的内存空间的,需要对象实例化来调用。析构函数可以声明为虚函数,有时是必须声明为虚函数,因为删除指向派生类的基类指针的时候,派生类的析构函数不会被执行,会造成内存泄漏。最好不要在构造函数和析构函数里调用虚函数

19.逗号表达式

以逗号分隔语句,从左往右取右边的语句。eg:int a = (1,3,11); int b = a;  b的值为11。

20.重载函数

21.标准模板库(Standard Template Library, STL)

是C++标准库的一部分,定义了标准模板的声明,都是类的模板,可以用来定义具体的类。六大组件有:容器、迭代器、算法、函数对象、适配器、分配器。

22.unsigned 和signed

有符号和无符号的区别是,无符号的可以存储两倍的整数,比如int型的有符号的存储范围是-32768~32767,而unsigned能存储的数据范围则是0~65535

23.运算符优先级

优先级从高往低:括号、逻辑非、二元乘除运算、二元加减运算、逻辑与

24.read函数

把指定的文件传送到count字节到buf指针所指的内存中,成功返回读取的字节数。可以从文件中获取字符,还能用于二进制文件的操作,对函数所获取字符多少本身没有限制。

25.explicit

可以阻止经过转换构造函数进行隐式转换

26.友元函数

友元函数是类外的函数,声明放在类的私有段或者公有段。但是友元函数破坏了封装机制。友元函数是为了访问私有变量或保护变量。

27.类和对象

类是创建对象的模板,对象是类的实例,拥有类的成员变量和成员函数。创建好对象后,用"."来访问类的函数或变量。但使用new在堆上创建的对象是匿名的,没法直接使用,必须使用一个指针,借助指针访问它的成员变量和函数,访问的形式是"->"。

eg: class student{

        public :

              char * name;//成员变量

              void say(){//成员函数

               cout << “名字是: ”<< name<< endl;

 }

};

      int main(){

  student *pstu = new student;

  pstu-<name = "moon";

  pstu-<say();

  delete pstu;//删除对象

  return 0;

}

28.重载函数

重载函数是函数的一种特殊情况。在同一范围内,声明功能相似的同名函数,但同名函数的形参(参数的个数、类型、顺序)不同,同一个运算符完成不同的运算功能。重载和内联机制既可用于全局函数,也可用于类的成员函数,const和virtual机制仅用于类的成员函数。

29.char* s = 0x0 定义了常数字符串,内容不可修改。

char x[] = "abc",数组最后还有结束符‘\0’。

30.&,^

&与运算,相同(00或11)为1,不同(01,10)为0;^异或运算,相同为0,不同为1。

m&(m-1)这样的操作相当于把m的二进制中的低位的1转换成0

31.引用

引用是有编译器通过直接替换等技术手段提供的功能,相当有给变量取了别名,是不占用内存空间的,因此引用变量必须初始化,否则无法确定被替换对象。如果是类的数据成员是引用类型,必须在任何成员函数被调用前被初始化,只能在初始化列表中完成初始化。 引用类型,避免了拷贝数据,效率比值传递高。函数体内的栈变量,在函数返回后背编译器回收,因此无法返回引用类型的栈变量。

32.堆栈

堆是动态存储结构,在程序需要存储空间时,由程序申请,并且由程序复杂删除,否则容易产生内存泄漏,是不能静态分配的。堆上频繁的调用new/delete容易产生内存碎片,但栈上的数据保持后进先出。有编译器完成数据的分配和销毁,不会有碎片。对都可用大小理论上和操作系统的虚拟地址范围形同,而栈是有编译器实现确定的某个较小的值,如果持续递归调用不退出,终究会发生栈溢出错误。

33.面向对象

对象是软件系统中基本的运行时实体,对象封装了属性和行为。封装是一种信息隐藏技术,目的是使对象的使用者和生产者分离。

34.Debug和Release

Debug中存在相应的保护机制检查是都内存访问越界,而Release不会进行相应的检查。

参考文献:https://www.cnblogs.com/deng-tao/p/6020369.html

35.类型转换

c++语言中数据类型不是随意转换的,基本类型只有具备隐含转换关系才可以专函,自定义类型必须具备继承关系才可以转换。C语言是任何类型都可以转换的。

static_cast和dynamic_cast是用于强制类型转换的,其中dynamic_cast是遍历继承树的,而static_cast中时编译器隐式执行的任何类型转换可以由它显示完成。int可以转换成double,但是不能将int*转换到double*

36.python 帮助

eg:查看len文档信息。help(len)

37.python lambda函数

:前面是参数,可以有多个,用“,”隔开,:后面是表达式。lambda函数不能包含命令,包含的表达式不能超过一个

eg:

a = lambda x:x*x
print(a(3))

lambda中*能接收不定长度定位参数,以元组形式返回

eg: a =lambda *x:x;a(7,'月'),输入:(7,'月')

python map函数

map函数是python的内置函数,它接受参数,将传入list内的参数全部按f函数执行操作。

eg:list(map(lambda x:x*2,[1,2,3,4,'hi']))

返回[2,3,6,8,'hihi']

38.C语言枚举

定义形式:enum typeName{valueName1,valueName2,....};枚举变量不能是字符型的

eg1.enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };

eg2. enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;

eg3.enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };

eg4.enum week a = Mon, b = Wed, c = Sat;

39.C语言模板

template <class或者也可以用typename T>

返回类型 函数名(形参表)
{//函数定义体 }

39.python中sys模块中argv负责接收命令行传入的参数,其中argv[0]为文件名,argv[1]为第一个参数

40.python中类中重写_str_魔术方法可以在对象被print时返回特定信息。_init_是用初始化对象时触发,_cmp_用于对象比较时触发。

41.python中eval为对一个对象求值。

42.python中Stackless Python是python中重要的多线程模块。提供并发的建模工具,比目前其它大多数传统变成语言所提供的工具更加易用。

43.python中raise可以定义一条异常,引发异常。一旦执行了raise语句,raise后面的语句将不能执行。python中子类调用父类时,需要使用函数super。fromkeys是字典对象提供的方法,用于创建一个新字典,以第一个词参数中的元素为字典的键,第二个参数为键对应的初始值。

44.python中的数据类型可分为可变与不可变类型,函数的传入参数也是一样。如果传入的参数类型是可变类型,如果在函数体中被改变,则原参数也会被改变。

45.python 中HTTP,content-Type属性指定相应的HTTP内容类型,用于定义网络文件的类型和网页的编码,决定文件接受方将以什么形式、什么编码读取这个文件。100表示继续客户端当继续发送请求;102表示继续处理;201表示服务器在请求的响应中建立了新文档,应在定位头信息中给出它的URL;202请求被接受,但处理未完成。

46.ostream流

put()是ostream流的成员函数,函数原型:ostream&put(char ch),cout 为输出流对象,调用时应使用成员选择运算符(.)。

47.一般以十六进制为单位表示内存地址,要用十进制输出的话,需要强制转换,比如加long。

48.python中保留关键字的冲突,不能用关键字命名

49.拷贝

默认发赋值运算符只是内存值的直接拷贝,即浅拷贝;

50.内联函数

内联函数用在函数的定义中,在编译中实现使用,消除了调用时的时间,通常用于频繁使用小内存的函数。如果是成员函数,对象的地址会被放在合适的地方。具备宏代码的效率,增加了安全性,还可以自由操作类的数据成员。但是在使用assert时要注意。构造函数和析构函数会隐藏一些行为,比如偷偷调用基类或成员对象对象的构造函数和析构函数,所以不要轻易让构造函数和析构函数成为内联函数。

使用宏代码容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应(比如运算符之间会有一些优先性)。也不能进行调试,无法操作类的私有数据成员。

51.运算符重载

关键字operator加运算符来表示函数,叫做运算符重载。只能重载为成员函数的运算符确保了调用它们的对象(左边操作数)必须是重载了它们类的对象。不能重载为成员函数的运算符一般是因为发起了调用的对象(坐标操作数)非必须是重载它们类的对象,或者是这些运算符的特殊性质(如左右操作数可互换)使然。

52.python中如果一个函数没有return 语句,则调用它的返回类型是NoneType,返回值是none

53.python中不支持索引访问的是集合。

54.预编译

宏:#define  宏可以嵌套,不能调试,和左括号间不能出现空格。不使用某个宏时,用#undef来取消其定义。

条件编译:控制预处理器选择不同代码段作为编译器的输入,使得源程序再不同的编译条件下参数不同目标代码。条件编译伪指令包括#if,#ifdef,#elif,#else,#endif,defined。以#if开始,#endif结束。

#error:用于输出平台、环境等相关信息。

#pragma:执行语言实现定义的动作。 eg: #pragma warning(disable:4069) /*不要产生第C4069号编译警告*/

预定义符号常量:预处理器在处理代码时将它们替换为确定的字面常量,可以被直接引用,输出调试信息和定位异常发生的文件和代码行。如:_LINE_。

55.动态特性

程序的功能在编译时就确定下来,为静态特性,如果是在运行时才确定下来,称为动态特性。

56.面向对象

高层模块不应该依赖于底层模块。传统的结构设计中,一般高层模块需要调用或使用底层模块,导致高层模块必须依赖于底层模块,但借助面向对象中的抽象类、接口等一系列机制,使得高层模块仅仅和借口耦合,和实际的底层模块没有直接关联。

57.函数调用

形参实参:函数调用基本参数传递方式有传值与传地址两种,在传值方式下是将实参的值传给形参,因此实参可以是表达式(或常量),也可以是变量(或数组元素),这种信息传递是单向的,形参不能再将值传回实参。在传址方式下,需要将实参的地址传递给形参,因此,实参必须好似变量(数组名或数组元素),不能是表达式(或常量)。这种方式下,被调用函数中对形式参数的修改实际上就是对实际参数的修改,因此客观上可以实现数据的双向传递。

58.python中list类型是一种stack类型。自带append和pop方法,实现上就是一个stack。

python中的deque是双端队列。heapq是一种完全二叉树结构的类型。python的正则非贪婪模式使用符号\?。

59.python中使用locals()函数可以查看包含当前作用域内所有局部变量和值的字典。

60.Python中浅拷贝copy.copy,当修改的元素为可变对象是,修改操作会修改原列表;深拷贝copy.deepcopy对源对象中所有值完全复制一份存放在内存中,这样遇到原对象即使修改,也不会影响值。

61.动态特性

静态特性:程序的功能在编译的时候就确定下来的;动态特性:程序的功能在运行的时候确定下来的。

虚函数、抽象基类、动态绑定

虚函数的符号是virtual,

其中抽象基类是为了让其派生类实现其接口方法;可以实现彻底的封装。

动态绑定,先声明为虚函数,然后用指针或者引用指向它.

62.new

63.数组

64.对象模型

非静态数据成员被放在每一个对象体内作为对象专有的数据成员;静态数据成员被提取处理放在程序的静态数据区内作为该类所有对象共享,因此仅存在一份;静态和非静态成员函数最终都被提取处理放在程序的代码段中并为该类的所有对象共享,因此每一个成员函数只存在一份代码实体;类内嵌套定义的各种类型与放在类外面定义的类型除了作用域不同外没有本质区别。

构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。

65.python中集合

frozenset创建的集合的初始化参数只能有一个

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值