牛客C++专项训练5.11 默认构造函数+静态+指针+函数指针+输出+深拷贝+浅拷贝

日常训练 专栏收录该内容
13 篇文章 0 订阅

1.如果没有为一个类定义任何构造函数的情况下,下列描述正确的是(        )

正确答案: A   你的答案: A

A编译器总是自动创建一个不带参数的构造函数

B这个类没有构造函数

C这个类不需要构造函数

D该类不能通过编译

总体来说,只有A最合适。但是,A其实也是有点问题的,比如说当类X包含其他类成员Y时,而Y并并不能使用合成的构造函数,此时就不会创建一个不带参数的构造函数。

c++ primer 5th P236中指出:

如果类包含有内置类型或者复合类型的成员,则只有当这些成员全部被赋予了类内的初始值时,这个类才适合于使用合成的默认构造函数。

编译器必须为类合成默认构造函数的情况

一、成员对象带有默认构造函数

二、基类带有默认构造函数

三、带有虚函数

四、类派生自一个继承链,其中存在一个或更多的虚基类

 

2.关于C++中的new和C语言中的malloc,以下说法哪几个是正确的:()

正确答案: A   你的答案: A

A都是用来申请内存的

B都是函数                                     malloc是库函数,而new是操作符

C都会调用构造函数                    由于malloc是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc。

D他们没有区别,都一样

 

 

3.在c++中,下列描述错误的是(        )

正确答案: A   你的答案: D

A在创建对象前,静态成员不存在        程序运行的时候,静态成员已经加载在内存里面了,但是包含静态成员的对象共享这些静态成员

B静态成员是类的成员

C静态成员不能是虚函数

D静态成员函数不能直接访问非静态成员

静态的使用注意事项:

1.静态方法只能访问静态成员(包括成员变量和成员方法)

   非静态方法可以访问静态也可以访问非静态

2.静态方法中不可以定义this,super关键字

   因为 一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。静态方法在优先于对象存在,所以静态方法中不可以出现this,super关键字。

3.主函数是静态的

程序运行的时候,静态成员已经加载在内存里面了,但是包含静态成员的对象共享这些静态成员
比方说,A有一个静态成员public static int i;那么程序运行的时候,这个i就加载进内存了,A的所有对象的i变量都指向这个静态空间的i,也就是说创建对象之前,它就占空间了

1:只有类的成员函数才能说明为虚函数;  
2:静态成员函数不能是虚函数;  
3:内联函数不能为虚函数;  
4:构造函数不能是虚函数;  
5:析构函数可以是虚函数,而且通常声明为虚函数

 

4.以下代码执行后,it 的数据为:
std::list<int> temp;
std::list<int>::iterator it = temp.begin();
it = --it;

正确答案: C   你的答案: A

A 未知

B temp.end()

C异常

D   NULL

list是双链表容器,前驱和后继逻辑上的相邻,地址并不相邻,迭代器减,是在地址上减减的,就异常了

 

5.有如下一段程序:

int f1(float);
int f2(char);
int f3(float);
int f4(float);
int (*pf)(float);

则以下不合法的是:()

正确答案: C   你的答案: D

A   int (*p)(float)=&f1;

B   pf=&f4;

C   pf=&f2;                  //函数形参类型不匹配

D   pf=f3;

函数指针变量

函数指针变量的声明方法为:

返回值类型 ( * 指针变量名) ([形参列表]);

函数地址

C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。
函数地址的获取,可以是函数名,也可以在函数名前加取地址符&

 

6.能够把指定长度的字节序列插入到输出流中的函数是()。

正确答案: B   你的答案: D

A  put

B  write

C  cout

D print

write函数所在的头文件为 <unistd.h>

write有两种用法。一种是:

ssize_twrite(int handle, void *buf, int nbyte);

handle 是文件描述符

buf是指定的缓冲区,即指针,指向一段内存单元;

nbyte是要写入文件指定的字节数;返回值:写入文档的字节数(成功);-1(出错)

write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.

另一种是:write(const char* str,int n)

str是字符指针或字符数组,用来存放一个字符串。n是int型数,它用来表示输出显示字符串中字符的个数。

write("string",strlen("string");表示输出字符串常量

 

7.关于浅复制和深复制的说法,下列说法正确的是

正确答案: A B C D   你的答案: A B C D

A 浅层复制:只复制指向对象的指针,而不复制引用对象本身。

B 深层复制:复制引用对象本身。

C 如果是浅复制,修改一个对象可能会影响另外一个对象

D 如果是深拷贝,修改一个对象不会影响到另外一个对象

浅拷贝(指针拷贝):只复制指针内容,不复制指针所指对象,结果为两个指针指向同一块内存;

深拷贝(对象拷贝):重新为指针分配内存,并将原来指针所指对象的内容拷贝过来,最后结果为两个指针指向两块不同的内存;

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值