C++ 练习3 [牛客]

发布时间:2023-10-09 11:30

C++ 练习3 [牛客]

  • 1.题目
    • 1. 结构体可以有构造函数
    • 2. 地址
    • 3.构造函数的调用
    • 4.可能代码体积膨胀
    • 5.虚函数继承(多态)
    • 6.二维数组初始化
    • 7.指针与引用
    • 8.fork()函数
    • 9.vector遍历并删除erase()
    • 10.explicit 与 protected
    • 11.构造函数的调用
  • 2.总结
  • 3.更新日志

1.题目

1. 结构体可以有构造函数

C++ 练习3 [牛客]_第1张图片

在c++中类和结构体的唯一区别是
	默认状态下,类中的成员默认是私有的,结构体中的成员默认是公有的。
c++中的结构体和c中的结构体的区别
	c++中的结构体引入了成员函数,继承,访问控制等面向对象的特性
	c中的空结构体的大小为0,c++中的空结构体和空类一样,大小是1
c++中空类的大小是1的原因
	空类可以实例化成不同的对象,不同的对象在内存中的地址不同,所以隐含地加入一个字节来标识不同的对象。

2. 地址

C++ 练习3 [牛客]_第2张图片

3.构造函数的调用

C++ 练习3 [牛客]_第3张图片

语句“MyClass a[4]”定义了4个MyClass对象,分别为a[0],a[1],a[2],a[3],调用4次构造函数;
语句“MyClass *p[5]”定义了5个指向MyClass对象的指针变量,分别为*p[0]*p[1]*p[2]*p[3]*p[4]
但 定义指针并没有实例化对象 ,所以不调用构造函数。
因此,执行该语句共调用MyClass的构造函数4

4.可能代码体积膨胀

C++ 练习3 [牛客]_第4张图片

这里的膨胀是指代码编译时较编辑时体积大。 宏定义,模板,内联函数都能在编辑时精简我们的代码。
但在编译时宏定义会文本替换,模板会加上类型(类似java泛型),内联函数也会替换成函数代码。

D选项是容易爆栈,不是代码区。

5.虚函数继承(多态)

C++ 练习3 [牛客]_第5张图片
C++ 练习3 [牛客]_第6张图片

这道题目可以这么去拆分就很好理解了:
 ((B *)(&c))->func()   ==》   B *temp;   temp = &c;    temp->func();   ==》 这不就是一个典型的多态问题,用 基类指针指向派生类对象 ,所以肯定调用的是 派生类C对象的func函数,输出 C test

((B)c).func();   ==》 不涉及指针的操作,自然就没有多态行为的发生。

6.二维数组初始化

C++ 练习3 [牛客]_第7张图片
C++ 练习3 [牛客]_第8张图片

C++ 练习3 [牛客]_第9张图片

7.指针与引用

C++ 练习3 [牛客]_第10张图片

声明变量strs为str1的引用,即strs是str1的别名,并不需要另外开辟内存单元来存放strs的值。strs和str1占内存中的同一个存储单元,它们具有同一地址。
注意:
(1)引用不是一种独立的数据类型,对引用只有声明,没有定义。(必须先定义一个变量,然后声明对该变量建立一个引用)
(2)声明一个引用时,必须同时使之初始化,及声明它代表哪一个变量。
(3)在声明一个引用后,不能再使之作为另一变量的引用。
      int a1 a2;
      int &b = a1;
      int &b = a2; //错误,不能把b又变成a2的引用
      b = a2;     //可以,因为b作为a1的引用,b就和a1一致,故相当于a1 = a2;4)不能建立引用数组,不能作为数组元素的别名
(5)不能建立引用的引用。
        int a = 3;
        int &b = a;
        int &&c = b;  // 不能建立引用的引用(C++中 &&表示右值引用)
        int * p = b;  //不能建立指向引用的指针6)可以取引用的地址(如已声明b是a的引用,则&b就是变量a的地址&a)
        int *pt;
        pt = &b; // 把变量a的地址赋值给指针变量pt7)在声明了引用后,在使用它的时候不带&,而只引用引用的名字(如b,而不是&b)。

补充,右值引用:
	int&& b = 100;   //右值引用
	b = 10;      //对右值的修改
	cout << b;

8.fork()函数

C++ 练习3 [牛客]_第11张图片
C++ 练习3 [牛客]_第12张图片

fork函数的特点概括起来就是“调用一次,返回两次”
在父进程中调用一次,在父进程和子进程中各返回一次。

9.vector遍历并删除erase()

C++ 练习3 [牛客]_第13张图片

erase()函数的特点就是删除当前的元素,并自动指向下一个元素,所以这里iter不需要在自增了

10.explicit 与 protected

C++ 练习3 [牛客]_第14张图片

A.explicit关键字强制仅有显式调用有效 ,正确,C++提供关键字explicit,用于阻止不应该允许的经过转     换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。
B.保护成员可以在定义它的类中使用,也可以在派生类中使用,正确。保护类就是为了继承产生的
C.保护成员仅可以在定义它的类中使用。错误,见B

11.构造函数的调用

C++ 练习3 [牛客]_第15张图片
C++ 练习3 [牛客]_第16张图片

2.总结

3.更新日志

2022.7.7 整理

欢迎交流、讨论、指正~
不正确、不理解之处欢迎评论留言~

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号