shared_ptr是一种智能指针,记录有多少个shared_ptrs共同指向一个对象,即引用计数。shared_ptr不能管理循环引用的对象,如果使用不当的话,会引起内存泄漏。(为了解决这个问题引入了弱指针 weak_ptr)
构造和析构相反进行,可以想象成构造从内到外构造(父类到子类),析构从外到内拆除(子类到父类)
父类先构造,然后子类构造,结束时,子类先析构,然后父类最后析构
某一基类有构造函数A(),析构函数~A(),其派生类B的构造函数析构函数分别为B(),~B()
开始时,先调用A(),再调用B(),结束时,先调用~B(),再调用~A()
各类函数中:构造函数、析构函数、拷贝初始化构造函数等是类的成员函数。
C语言系统中,如果int型数据占2个字节,则说明该系统是16位的系统,
此时double型数据占8个字节,long型数据占4个字节,unsigned int占2个字节,char
型数据占1个字节。
若要以写方式打开当前目录下文件abc:txt:::fopen("abc.txt","w");
假定一个类的构造函数为B(int x,int y){a=x--;b=x*y--;}。则执行B(3,5);语句后,a和b的值分别是
(3和10)
若有 int *p=(int *)malloc(sizeof(int));则向内存申请到内存空间存入整数123的语句为:
p 是 int 的指针类型,scanf 要求 %d 相应参数也是 int 的指针类型 scanf("%d",p);
scanf("%d",&p); &p 又取了一次 p 的地址,相当于指针的指针, scanf 尝试写入原本是指针的地址,导致 p 的值被改变(本应写入 p 指向的内存),后续解引用 *p 可能导致访问非法内存 产生运行时读内存错误。
scanf("%d",*p); *p 解引用取值,是一个未初始化的乱值, scanf 会把该值当作地址,可能导致运行时写内存错误或写入不被期望的内存区域。
scanf("%d",**p); p 只是一次指针, **p 会编译错误。
如果cur强制被转化成字符类型的指针,那么加2,就是加2个字符的大小,即为c,如果cur是对象指针,那么加2的话,就指向第3个object类型的对象。
*(char*)((char *)(cur)+2),cur被强制转化为char*类型,然后+2,那么就是加两个字节,就是c。外面那个(char*)是为了转换为字符型指针与%c对应,本题可以不要,因为本来就是字符。
*(char*)(cur+2)),cur的类型是object*,那么cur+2就是加两个obect的大小,就是6,因此是g。同样,外面那个(char*)是为了转换为字符型指针与%c对应,本题可以不要,因为本来就是字符。
struct sk{ int a; float b; } data, *p=&data;
如果是指针指向结构体,就用 -> (“形状像个箭头,表示指向,记为指针访问结构体成员的方式”)
结构体类型名访问结构体成员变量 用 . 成员访问运算符
综上可以用 : p-> a 或者 (*p).a
char s[10];s="abcdefg";
s表示字符串首地址,所以不能被赋值iiiiiiiiiiiiiii
%*4s表示读取一个长度为四个字符的字符串,中间的*表示将读取到的字符串忽略,不赋给变量列表中的变量。
scanf("%2d%*4s%2d", &x, &y);
将输入的前两位给x,跳过中间的四个字符,将之后的两位给y。所以x=12,y=78.
*赋值禁止字符,跳过输入字段,不进行赋值;
%2d:2表示指定最大字段宽度,对输入数据按格式对2位整数作赋值;
字符"23456"不作赋值,故:x=12,y=78;
第一个 i++, ++i.
1.1 - i++,指的是先使用然后再增加,比如: int i = 1; int i_pp = i++: // i_pp = 1;
1.2 - ++i, 指的是先加然后再使用,比如:int i = 1; int pp_i = ++i; //pp_i = 2;
这两点清楚后,就会知道
switch(k> -i++) 等同于switch(k> -1) //k = 0,所以statement为true即为1。
第二个,switch case。
当switch case没有break的时候,将会按照代码行数一一执行下去。
通过第一点,得到了switch(1),所以进入case 1,由于没有break,再进入case0,但是,i,已经在switch statement的时候更新了 ,也就是说这个时候的,i,已经是2了。
类成员默认为private的,struct成员默认为public.
类A1、A2和A3中的成员函数show1、show2和 show3都是public(公开的),因此,各个类都可以通过对象调用该成员函数,即选项A、B和C;又因为这个属于类的多继承关系,即A1(基类)-->A2--->A3,由于A3继承A2的继承方式是protected(受保护的),所以类A1中的show1函数在派生类A3中是 protected,因此,不能通过类A3的对象访问 类A1中的 show1,故D选项错。
include <file> //在标准库及默认搜索目录中寻找将要 include 的文件 ;
include "file" //先在当前目录中搜索文件,然后再到默认搜索目录中搜寻。
shape *s1=&r;
shape &s2=r; 是对的。
class shape
{public:
virtual intarea()=0;
};
shape为抽象类,不可实例化
若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f
//在f函数定义的后面,其它的函数也是可以调用f函数的
若在主函数前对函数f进行说明,则在主函数和其后的其它函数中都可以正确调用函数f
//正确
对于以上程序,编译时系统会提示出错信息:提示对f函数重复说明
//在C语言中变量或函数可以重复声明,但是不能重复定义
函数f无返回值,所以可用void将其类型定义为无值型
//正确
C++的容器有两种类型的容器:顺序容器和关联容器。
顺序容器:又称线性容器,将数据组织成有限线性集合,主要有:vector、list、deque等。
vector(向量)表示一段连续的内存地址,基于数组的实现,可以动态的增加或减少。
list(链表)表示非连续的内存,基于链表实现。
deque(双端队列)与vector类似,但是对于首元素提供删除和插入的双向支持。
关联容器:主要有map和set(底层是红黑树–平衡排序二叉树)
map的元素是以key-value形式存在的,key是键值(键值不能重复),value是实值(可以重复),并以key值进行元素排序,查找。
set的元素是单值(键值与实值相同)的,是唯一的,其以实值排序、查找元素。
multimap和multiset: 可以存放多个相同的key值。
STL各种容器和算法的sort和find函数对重载运算符的调用情况:
1、二叉树类型的容器的std::sort和std::find时都会调用operator < 。
2、线性类型(vector、list)容器std::sort算法时会调用operator <;使用std::find算法会调用operator ==。
线性容器(以vector为例)的重载运算符" < " 和" == "
二叉树类型的容器的sort和find都会调用operator <
线性类型容器sort会调用operator <
线性类型容器使用std::find会调用operator ==.
对于类与结构体等自定义类型数据的容器对象,重载运算符operator < 与operator ==有两种形式:一种是在类或结构体中直接以成员函数的形式定义;另一种就是在类外定义一个比较函数compare(),以函数指针(或函数对象)的形式作为函数参数传入(针对sort()排序函数)
网友评论