【C++】类和对象(下)相关练习

news/2024/9/23 7:12:43 标签: c++, 开发语言

1. 求1+2+3+...+n

 题目要求和,但是像循环,递归,求和公式这样的方法都不让用,这种情况下我们最先想到的就是static成员变量的使用。我们每创建一个类对象就会调用一下构造函数,加上static修饰后出局部作用域不会销毁,这给我们提供了一个思路。

我们先重新创建一个Sum类,成员变量是静态成员变量,成员函数一个是对调用次数进行累加的,一个是返回最终结果的静态成员函数。

class Sum
{
public:
	Sum()
	{
		_ret += _i;  //_ret初始为0,_i初始为1
		_i++;  //_i自增,实现1+2+3...+n的结果
	}
	static int GetSum()
	{
		return _ret;
	}
private:
	static int _i;
	static int _ret;
};

//类外初始化静态成员函数
int Sum::_i = 1; 
int Sum::_ret = 0;

而在题目给的Solution类里面,成员函数Sum_Solution中,我们需要对Sum类创建n个大小的变长数组,这样Sum的构造函数就可以被调用n次,就能实现1+2+...+n了。

class Solution
{
public:
	int Sum_Solution(int n)
	{
		Sum a[n];  
		return Sum::GetSum();
	}
};

我们学了内部类,也可以把Sum这个类当作一个Solution类的内部类实现。

class Solution
{
private:
	static int _i;
	static int _ret;
	class Sum  //内部类
	{
	public:
		Sum()
		{
			_ret += _i;
			_i++;
		}
	};

public:
	int Sum_Solution(int n)
	{
		Sum a[n];
		return _ret;
	}
};
int Solution::_i = 1;
int Solution::_ret = 0;

 最后看一下两种方法的对比。

2.构造函数和析构函数调用顺序问题

设已经有A、B、C、D四个类的定义,程序中A、B、C、D构造函数的调用顺序为?析构函数的调用顺序为?

C c;
int main()
{
    A a;
    B b;
    static D d;
    return 0;
}

先说构造。全局变量是在进main函数之前就创建好了,所以c的构造函数最先调用,a和b谁在前谁先调用构造,所以a的构造函数肯定在b前面调用,那a、b两个和d相比哪个先调用?答案还是a、b先调用,当程序运行到d时才调用。所以最终顺序就是c a b d

再看析构。先看最简单的,a和b,我们说过先定义后析构,所以b比a先调用构造函数。再来看d和c,d和c的生命周期是全局的,先析构d然后c。所以最终顺序是b a d c

 3.初始化顺序问题

下面代码结果是什么?

#include <iostream>
using namespace std;
class A
{
public:
	A(int a)
		:_a1(a)
		,_a2(_a1)
	{}
	void Print()
	{
		cout << _a1 << " " << _a2 << endl;
	}
private:
	int _a2 = 2;
	int _a1 = 2;
};
int main()
{
	A a(1);
	a.Print();
	return 0;
}

结果是:1 随机值

因为先声明的先初始化,_a2比_a1先声明。先初始化_a2,在初始化列表里面是要用_a1去初始化它,而此时的_a1还没初始化,是个随机值,所以就是一个随机值初始化_a2;然后再初始化_a1,在初始化列表里用参数a初始化,a传的值是1,所以_a1就是1.


http://www.niftyadmin.cn/n/5671619.html

相关文章

回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测

回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测 目录 回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.ReliefF-xgboost回归预测代码&#xff0c;对序列数据预测性能相对较高。首先通过ReleifF对输入特征计算权…

责任链模式实现规则校验

1、项目中责任链模式实战 我们使用责任链模式实现对订单中参数的校验&#xff0c;首先校验订单id是否为空&#xff0c;然后校验下单人是否为空&#xff0c;最后检验收获地址是否为空。业务的流程图如下所示&#xff1a; 针对上述的业务&#xff0c;我们使用责任链的模式来实现…

【d47_2】【Java】【力扣】1791.找出星型图的中心节点

思路 直接判断 edges[0][0] edges[0][1] edges[1][0] edges[1][1] 谁重复了 例如&#xff1a; [ [1,2] [2,3] ....],那么中心节点一定是2 代码 class Solution {public int findCenter(int[][] edges) {for (int i0;i<1;i){if (edges[1][0]edges[0][i]) {return edg…

zabbix email 告警

配置媒介、触发器动作&#xff08;动作、操作&#xff09; 为用户 定义媒体&#xff0c;比如电子邮件地址 动作 - 条件

程序员如何保持与提升核心竞争力

一、引言  随着AIGC&#xff08;人工智能生成内容&#xff09;的快速发展&#xff0c;如chatgpt、midjourney、claude等大语言模型的涌现&#xff0c;AI辅助编程工具正逐渐成为程序员日常工作的得力助手。这一变革不仅对程序员的工作方式产生了深刻影响&#xff0c;也引发了关…

JVM的基本概念

目录 一、JVM的内存划分 二、JVM的类加载过程 三、JVM的垃圾回收机制&#xff08;GC&#xff09; 四、分代回收 一、JVM的内存划分 一个运行起来的Java进程&#xff0c;就是一个Java虚拟机&#xff0c;就需要从操作系统中申请一大块内存。申请的内存会划分为不同的区域&…

怎么删除右键出现的Open Folder as Intellij IDEA Project

首先&#xff0c;WinR 输入 regedit &#xff08;注册表编辑器&#xff09;&#xff0c;然后按Enter。 1.右键单击文件夹背景时&#xff08;出现的情况&#xff09;&#xff1a; 在注册表中打开“ 计算机 \ HKEY_CLASSES_ROOT \ Directory \ Background \ shell \ IDEA Commun…

OpenCV特征检测(8)检测图像中圆形的函数HoughCircles()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在灰度图像中使用霍夫变换查找圆形。 该函数使用霍夫变换的一种修改版本在灰度图像中查找圆形。 例子&#xff1a; #include <opencv2/imgp…