918c++ 易混淆的选填题

推荐一个在线编程c++的网址:c++

建议观看这个视频:100道c++题目讲解

如果时间充足且看完上面那个视频可以看看这个:c++题目进阶

在这里插入图片描述
常量字符串必须初始化
在这里插入图片描述
函数会一一对应按顺序解析参数第二个参数不能是字符串只能是int类型
在这里插入图片描述
在C++程序中,如果我没没有对函数的类型进行说明的话,那么函数的默认类型是int类型的,也就是说函数必须返回一个int型的返回值。
在这里插入图片描述
常成员函数需要在声明和定义的时候在函数头部的结尾加上 const 关键字
在这里插入图片描述
c++与Java不同,未定义的类为private
在这里插入图片描述
为什么静态成员函数只能访问静态成员变量。

答:1.静态成员函数只属于类本身,随着类的加载而存在,不属于任何对象,是独立存在的

2.非静态成员当且仅当实例化对象之后才存在,静态成员函数产生在前,非静态成员函数产生在后,故不能访问

3.内部访问静态成员用self::,而访问非静态成员要用this指针,静态成员函数没有this指针,故不能访问。
在这里插入图片描述
在这里插入图片描述
第一题:a[3]调用3次,p是类指针。
类指针要分配了动态空间才调用构造函数的
第二题:a,b各一次,c调用3次,p是类指针。

动态联编需要满足三个条件:
1 类之间满足兼容赋值规则
2 声明虚函数
3 使用类的指针或者引用访问虚函数或者通过成员函数调用虚函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
单目运算符:只对一个变量进行操作。EX:a++;
双目运算符:对两个变量进行操作;EX:a=1; b=3; c=a+b;就是双目运算符;
三目运算符,又称条件运算符,也叫多目运算符:EX: b = (a > c) ? a : c;

在这里插入图片描述
关于静态和动态联编的博客:[https://blog.csdn.net/gaoxin1076/article/details/8298279]
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
c++这点与Java不同,Java只允许单继承也就是每个类只有一个父类,c++可以多继承
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
请讲一下析构函数与虚函数的作用和用法,是否存在虚析构函数
讲解视频:讲解

是否存在虚构造函数
答:不存在

在这里插入图片描述

这题考的是指针的使用,不理解的要重新研读指针的概念
A:&j表示j的地址,所以相当于拿i的值和j的地址比
B:如果单是p的话表示i的地址,但是*p表示的是i的值,所以相当于拿i的值和i的值比
C:上面说了*p相当于i的值,&j相当于j的地址,但是*一个地址相当于这个地址的值,所以相当于那i的值和j的值比
D:没有声明**p。

在这里插入图片描述
从语义角度上来说,protected继承是一种实现继承

从语法角度上来说,protected继承后,父类public和protected成员都变成子类的protected成员了

在这里插入图片描述
对于类中不能初始化变量的个人理解:

类的定义实际相当与类型声明,并没有分配存储空间,初始化的数据哪里放? 类实例化以后才会有实体存储地址及空间。

在这里插入图片描述

静态成员函数只能访问静态成员变量->静态成员函数没有this指针

在这里插入图片描述
解决多重继承二义性有三种办法分别是作用域分辨操作符,虚基类和同名覆盖。具体看开这篇博客 C++多重继承二义性解决

赋值兼容规则
对于公有派生来说,可以将派生类的对象赋给基类的对象,反之是不可以的。
赋值兼容性规则可以总结为4点:
1、不允许将基类的对象赋给派生类的对象。
2、派生类的对象可以赋给基类的对象。
3、可将派生类的对象的指针赋给基类的指针变量。
4、派生类对象可以初始化基类型的引用。
在这里插入图片描述
我觉得这题出的不好AB都可以,但是答案是A所以就贴出来。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序阅读题:

#include <iostream>					// 预处理命令
using namespace std;					// 使用标准命名空间std

class MyClass
{
public:
	MyClass(){ count++; }
	~MyClass(){	count--; }
	static int GetCount(){ return count; }

private:
	static int count;
};

int MyClass::count = 0;				// 初始化静态数据成员

int main(void)
{
	MyClass obj1;
	cout << MyClass::GetCount() << endl;
	MyClass obj2;
	cout << MyClass::GetCount() << endl;
	MyClass obj3;
	cout << obj1.GetCount() << endl;
	MyClass *p = new MyClass;
	cout << MyClass::GetCount() << endl;
	delete p;
	cout << MyClass::GetCount() << endl;

	return 0;                    		// 返回值0, 返回操作系统
}

上面程序的输出结果为:

1
2
3
4
3

//需要注意MyClass::GetCount()这样调用方法只触发构造函数不会触发析构函数

在这里插入图片描述

程序阅读题:

#include <iostream>					// 预处理命令
using namespace std;					// 使用标准命名空间std

class A
{
public:
	A() { cout << "A()" << endl; }
	~A() { cout << "~A()" << endl; }
	virtual void f() { cout << "A::f()" << endl; }
};

class B: public A
{
public:
	B() { cout << "B()" << endl; }
	~B() { cout << "~B()" << endl; }
	void f() { cout << "B::f()" << endl; }	
};

int main(void)					
{
	B obj;				
	A *p = &obj;				
	p->f();				

	return 0;                    		// 返回值0, 返回操作系统
}

上面程序的输出结果为:

A()
B()
B::f()
~B()
~A()

需要注意:
1.析构函数先调用派生类,后调用基类
2.构造函数调用优先级:基类构造函数总是被优先调用,这说明创建派生类对象时,会先调用基类构造函数,再调用派生类构造函数。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
![
](https://img-blog.csdnimg.cn/53fd9d96d6b641b38f15797e7e792cdf.png)
在这里插入图片描述

派生类对基类成员的三种访问规则:

1、私有继承的访问规则

当类的继承方式为私有继承时,基类的public成员和protected成员被继承后成为派生类的private成员,派生类的其它成员可以直接访问它们,但是在类的外部通过派生类的对象无法访问。

基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类的成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问。

2、公有继承的访问规则

当类的继承方式为公有继承时,基类的public成员和protected成员被继承到派生类中仍作为派生类的public成员和protected成员,派生类的其它成员可以直接访问它们。但是,类的外部使用者只能通过派生类的对象访问继承来的public成员。

基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数直接访问它们。

3、保护继承的访问规则

当类的继承方式为保护继承时,基类的public成员和protected成员被继承到派生类中都作为派生类的protected成员,派生类的其它成员可以直接访问它们,但是类的外部使用者不能通过派生类的对象访问它们。

基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类中的private成员。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一元运算符有1个操作数。例如,递增运算符"++“就是一元运算符,二元运算符有2个操作数。例如,除法运算符”/"有2个操作数。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
程序输出题:

void fun(int &x, int y)
{ int t=x; x=y; y=t; }
int main( )
{ int a[2] = {23, 42};
  fun(a[1],a[0]);
  std::cout<<a[0]<<","<<a[1]<<std::endl;
  return 0; }

23,23
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
A:定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
&&(与) ||(或)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
c:在类中定义的函数一般默认是inline的

在这里插入图片描述
这题选A
C++ 拷贝构造函数在哪几种情况下会被调用?

当类的一个对象去初始化该类的另一个对象时;
如果函数的形参是类的对象,调用函数进行形参和实参结合时;
如果函数的返回值是类对象,函数调用完成返回时。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
使用运算符对数据进行格式输出时,必须要包含iomanip.h头文件。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值