C++类和对象知识巩固:相关习题解析

news2025/1/28 1:01:56

目录

1,求下面析构的顺序

2,以下调用了多少次拷贝构造

3,计算日期到天数的转换

4,日期差值

5,打印日期

6,累加天数

7,求1+2+3...n,要求不能使用乘除法、for、while、if、else、switch等关键字及判断语气


1,求下面析构的顺序

//1,求析构的顺序
C c;
int main() 
{
	A a;
	B b;
	static D d; 
	return 0;
}

答:静态对象在程序启动时被创建,并且其存储空间在整个程序的运行期间都存在。它们不依赖于特定的作用域,不会因为某个函数或代码块的结束而被销毁

所以先析构局部的,再析构静态的

"对象创建时会调用构造函数来完成初始化。即便对象 d 是静态的,也是在程序执行到相应语句时才进行初始化"。

所以构造的顺序是  C  A  B  D

析构先析构局部对象 A B,再析构静态对象 C D,先创建的后析构,后创建的先析构

所以析构的顺序是  B  A  D  C

2,以下调用了多少次拷贝构造

class Weiget 
{
public:
	Weiget()
	{}
	Weiget(const Weiget& w) 
	{
		cout << "Weiget(const Weiget& w)" << endl;
	}
};
Weiget f(Weiget u) 
{
	Weiget v(u);
	Weiget w = v;
	return w;
}
int main() 
{
	Weiget x;
	Weiget y = f(f(x));
	return 0;
}

在做这个题目之前,我们先了解一段类似的代码,以下会进行几次拷贝构造

class A
{
public:
	A()
	{
	}
	A(const A& a)
	{
		cout << "A(const A& a)" << endl;
	}
};
A f(const A a)
{
	return a;
}
int main()
{
	A a1;
	A b = f(a1);
	return 0;
}

在不考虑优化的情况下,这段代码中会执行三次拷贝构造函数。

 

第一次是在函数 f 调用时,将实参 a1 传递给形参 a ,会调用一次拷贝构造函数。

 

第二次是在函数 f 中返回对象 a 时,会调用一次拷贝构造函数。

 

第三次是在 main 函数中,将函数 f 的返回值赋给 b 时,会调用一次拷贝构造函数。

在一些编译器优化的情况下,第二次和第三次拷贝构造可能会合并成一次。返回的 a 时候又立马赋值给了对象 b,所以一些编译器可能会做优化。以避免不必要的拷贝操作,提高程序的性能。

有了上面的案例,我们做这个题就是信手拈来的事了

一共调用了 7 次拷贝构造,如果不做优化就是 9 次拷贝构造

3,计算日期到天数的转换

计算日期到天数转换_牛客题霸_牛客网

日期类中判断日期是否合法与这个题目类似

除掉本月外,计算每个月的天数相加,再加上本月的天数

#include <iostream>
using namespace std;

int GetMonthDays(int year, int month) 
{
    int MonthDays[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    if(month == 2 && (((year % 4 ==0)&&(year %100 !=0)) || year%400==0))
    {
        return 29;
    }
    return MonthDays[month];

}
int main() 
{
   int year,month,day;
   cin >> year >> month >> day;
   int days = 0;
   for(int i = 1; i < month; ++i) 
   {
      days += GetMonthDays(year,i);
   }
   days += day;
   cout <<days <<endl;
}

4,日期差值

日期差值_牛客题霸_牛客网

我们先计算年,再算月份,最后算天数

年的天数:除掉该年,计算从 1 到该年之前的天数相加,闰年366,平年365

月的天数:  除本月,计算从1月到该月之前的月份天数相加,闰年2月29,平年28

天的天数:直接加上,最后还需要多加一天,因为题目说连续的日期算两天。

#include <iostream>
using namespace std;
bool isleapyear(int year) 
{
    if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) 
    {
        return true;
    }
    return false;
}
int SincetoBefore(int year,int month,int day) 
{
    int days = 0; 
    //加年的天数,从第一年开始加
    for(int i = 1; i < year; ++i) 
    {
        days += isleapyear(i) ? 366 : 365; 
    }
    //加月份的天数
    int Monthdays[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    for(int i = 1; i< month; ++i) 
    {
        if(i == 2 && isleapyear(year)) 
        {
            days += Monthdays[i];
        }
        else 
        {
             days += Monthdays[i];
        }
    }
    //加天数
    days += day;
    return days;
}
int main() 
{
    int year1, month1, day1;
    int year2, month2, day2;
    scanf("%4d%2d%2d",&year1,&month1,&day1);  //需要控制输入格式
    scanf("%4d%2d%2d",&year2,&month2,&day2);
    int days1 = SincetoBefore(year1,month1,day1);
    int days2 = SincetoBefore(year2,month2,day2);
    int day =  days1 > days2 ? days1-days2 +1 : days2 -days1+1; //输出的时候需要多加一天,题目说连续的日期算两天
    cout << day << endl;
    
}

 5,打印日期

打印日期_牛客题霸_牛客网

相对于就是把天数转成日期

1,计算月份,和剩余的天数,不断减,直到这个天数小于该月的天数,这和日期类中的日期加天数类似

2,我们有三个变量年、月、日 需要打印,所以我就用了一个简单的日期类打印,直接传值过去打印

#include <iostream>
using namespace std;

//日期类实现打印功能
class Date
{
public:
    Date(int year = 0,int month = 1,int day = 1) 
    {
        _year = year;
        _month = month;
        _day  = day;
    }
   void Print() 
   {
     if(this->_month> 9 && this->_day > 9) 
        cout << _year <<"-"<<_month <<"-"<<_day <<endl;
     else if(this->_month > 9 && this->_day <=9) 
        cout << _year <<"-"<<_month <<"-0"<<_day <<endl;
    else if(this->_month <= 9 && this->_day >9) 
        cout << _year <<"-0"<<_month <<"-"<<_day <<endl;
    else
        cout <<_year << "-0" <<_month <<"-0" <<_day;
   }
private:
    int _year;
    int _month;
    int _day;
};

//计算出月份和剩的天数
void Date_Print(int year, int days) 
{
    int month = 1;
    int monthDays[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    while(days > monthDays[month]) 
    {
        if(month == 2 &&(((year % 4 == 0)&&(year%100!=0)) ||year %400 == 0)) 
            days -= 29;
        else
             days -= monthDays[month];
        ++month;
        //月超出了1月,年进位,月置成 1
        if(month == 13) 
        {
            ++year;
            month = 1;
        }
    }
    Date d1(year,month,days);  //把年月日,传给日期类打印
    d1.Print();
}

int main() 
{
    int year = 0;
    int days = 0;
    while (cin>>year>>days) 
    {
        Date_Print(year,days);
    }
    return 0; 
}

6,累加天数

日期累加_牛客题霸_牛客网
 

与日期类中日期加天数类似

#include <iostream>
using namespace std;

class Date 
{
public:
    Date(int year = 0, int month = 1, int day = 1) 
        :_year(year)
        ,_month(month)
        ,_day(day)
    {}
    //日期累加
    Date& calculateDate(int days) 
    {
        _day += days;
        int Monthdays[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
        while (_day > Monthdays[_month])  
        {
            if(_month == 2 && ((_year % 4 == 0 && _year % 100 != 0) 
            ||( _year %400 ==0))) 
            {
                _day -= 29;
            }
            else 
            {
                 _day -= Monthdays[_month];
            }
            ++_month;
            if(_month == 13) 
            {
                ++_year;
                _month = 1;
            }
        }
        return *this;
    }
    //打印
    void Print() 
    {
       printf("%d-%02d-%02d\n", _year, _month, _day);
    }
private:
    int _year;
    int _month;
    int _day;
};
int main() 
{
    int m = 0;
    cin >> m; 
    int year, month, day, days;
    for(int i = 0; i< m; ++i) 
    {
        cin >> year >> month >> day >> days;  
        Date d(year,month,day);
        d.calculateDate(days);
        d.Print();
    }
}

7,求1+2+3...n,要求不能使用乘除法、for、while、if、else、switch等关键字及判断语气

求1+2+3+...+n_牛客题霸_牛客网
 

把 _sum 和 _i 设置成静态的变量,这样就属于所有的对象,而不是属于某个对象

 

Sum* p = new Sum[n];  n是几就会调用几次构造函数,相对于是一个数组,数组里面存的

是对象,n 是几就表示有几个对象,对象在创建的时候就会自动调用构造函数完成初始化

class Sum 
{
public:
    Sum() 
    {
        _sum += _i;
        ++_i;
    }
    static int GetNum() 
    {
        return _sum;
    }
private:
    static int _sum;
    static int _i;
};
int Sum::_sum = 0;
int Sum::_i = 1;

class Solution {
public:
    int Sum_Solution(int n) 
    {
        Sum* p = new Sum[n];
        return Sum::GetNum();
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1977630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot2自定义starter

1.创建maven项目。首先根据springboot 约定规范&#xff0c;Starter项目的命名规范如下&#xff1a; 建议自定义的starter 以 xxx-spring-boot-starter 命名&#xff0c;官方的Starter一般都是以spring-boot-starter-为前缀。这样做的目的是为了避免与官方或其他第三方提供的St…

C#-读取测序数据的ABI文件并绘制svg格式峰图

本地环境&#xff1a;win10&#xff0c;visual studio 2022 community 目录 前言问题描述实现效果解决思路实现要点ABI文件的组织方式svg绘制问题变色碱基值 动态设置svg图像宽度 前言 本文是在已有的代码基础上进行的开发&#xff0c;前期已经实现&#xff1a; ABI文件的解析…

8090怀旧视频素材去哪里找?怀旧童年的素材库分享给你

在这个充满活力的现代社会中&#xff0c;对80和90年代的复古风情的怀旧情感愈加浓厚。那些年的音乐、电影、日常生活乃至街头巷尾的景象&#xff0c;总能唤起人们的美好回忆。对于视频创作者而言&#xff0c;制作一部带有80和90年代怀旧风格的视频&#xff0c;不仅能触动观众的…

cgroup:Linux的资源控制机制

文章目录 1 cgroup 的主要功能1.1 资源限制1.2 优先级控制1.3 资源隔离1.4 资源监控 2 cgroup 的层次结构3 cgroup 子系统4 示例&#xff1a;使用 cgroup 控制 CPU 和内存4.1 创建 cgroup4.2 设置资源限制4.3 将进程添加到 cgroup 5 使用 systemd 管理 cgroup6 总结参考链接封面…

【人工智能】NLP入门指南:自然语言处理基础全解析

文章目录 前言一、NLPNLP&#xff08;自然语言处理&#xff09;NLU&#xff08;自然语言理解&#xff09;NLG&#xff08;自然语言生成&#xff09; 二、分词1.什么是分词2.常见的分词工具3.jieba分词 三、词向量1.什么是词向量2.文本张量表示方法3.常见的词向量模型3.1 ont-ho…

QT键盘和鼠标事件

这些事件都在QWidget 中的保护成员方法中 都是虚函数在头文件中声明了 需要类外重现实现 如果头文件中声明 类外无实现就会报错 void Widget::keyPressEvent(QKeyEvent *event) {switch (event->key()) {//获取按键case Qt::Key_W://按键wqDebug()<<"按下w"…

【Linux】网络基础_4

文章目录 十、网络基础5. socket编程网络翻译服务 未完待续 十、网络基础 5. socket编程 网络翻译服务 基于UDP&#xff0c;我们实现一个简单的翻译。 我们导入之前写的代码&#xff1a; InetAddr.hpp&#xff1a; #pragma once#include <iostream> #include <sys…

2000-2022年各地级市能源消费数据(夜间灯光ArcGIS计算)

2000-2022年各地级市能源消费数据&#xff08;夜间灯光ArcGIS计算&#xff09; 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;城市、省份、年份、能源消费总量(百吨标准煤) 3、范围&#xff1a;337个地级市 4、计算方法&#xff1a; 利用ArcGIS计算各地级市的DN总和…

【python案例】基于Python 爬虫的房地产数据可视化分析设计与实现

引言 研究背景与意义 房地产行业在我国属于支柱性产业&#xff0c;在我国社会经济发展中一直扮演着重要角色。房价问题&#xff0c;尤其是大中城市的房价问题&#xff0c;一直是政府、大众和众多研究人员关注的热点。如何科学地预测房价是房价问题的研究方向之一。随着互联网…

[WUSTCTF2020]朴实无华1

打开题目 扫目录用dirsearch扫&#xff0c;为节省建议只扫常见的目录&#xff0c;配置是&#xff1a; ./dirsearch.py -e bak,zip,txt,tgz,php -u http:..... -s 3 -t 20 访问一下 根据提示&#xff0c;再访问一次 提示不在这&#xff0c;抓包看看 根据提示&#xff0c;改ge…

(免费领源码)java#springboot#mysql大学校园旧物捐赠网站 25109-计算机毕业设计项目选题推荐

摘 要 在网络信息的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;企业只能以用户为导向&#xff0c;按品种分类规划&#xff0c;以产品的持续创新作为企业最重要的竞…

cocos creator绘制网格背景(基于矢量绘图)

在2D游戏开发中&#xff0c;设计2D地图的背景实现通常有以下几种方式&#xff1a; 静态背景图&#xff1a; 最简单的方式是使用静态背景图&#xff0c;即将整个背景作为一个静态图像加载到游戏中。这种方式适用于简单的游戏或者背景不需要变化的场景。 平铺背景图&#xff1a;…

Mathematica 矩阵基础操作指南

使用 Mathematica 进行矩阵操作的指南 目录 使用 Mathematica 进行矩阵操作的指南引言创建矩阵矩阵运算加法与减法 矩阵乘法矩阵转置逐元素运算 矩阵的行列式与逆行列式逆矩阵 矩阵分解LU 分解QR 分解特征值与特征向量 矩阵的可视化矩阵的热图矩阵的网格图 末 引言 最近笔者在…

分布式事务-使用队列实现最终一致性

分布式事务-扣减库存 一、最终一致性架构图 1、服务 左侧&#xff1a;创建订单服务Server1 右侧&#xff1a;扣减库存服务Server2 中间&#xff1a;独立消息服务Server3 2、中间件&#xff1a; Kafka-MQ、MySQL-db 二、步骤 0、定义MQ&#xff0c;三个状态 prepareconf…

spring原理(自学第八天)

aop的实现原理 AOP 底层实现方式之一是代理&#xff0c;由代理结合通知和目标&#xff0c;提供增强功能 除此以外&#xff0c;aspectj 提供了两种另外的 AOP 底层实现&#xff1a; 第一种是通过 ajc 编译器在编译 class 类文件时&#xff0c;就把通知的增强功能&#xff0c;织…

传输层_计算机网络

文章目录 运输层UDPTCPTCP连接管理TCP三次握手TCP四次挥手 可靠机制流量控制拥塞控制 QUIC 运输层 网络层提供了主机之间的逻辑通信 运输层为运行在不同主机上的进程之间提供了逻辑通信 UDP(用户数据报协议)提供一种不可靠、无连接的服务&#xff0c;数据报 TCP(传输控制协议)…

【Linux详解】基础IO:软硬连接 | 动静态库管理

目录 软硬链接 1. 介绍 2.理解 2.1 如何理解硬链接&#xff1f; 2.2 如何理解软连接&#xff1f; 动静态库 1.介绍 1.1 使用 1.2 什么是库&#xff1f; 2.生成 2.1 静态库 2.2 动态库&#xff1a; 软硬链接 1. 介绍 1.1 软连接 是一个独立文件&#xff0c;具有独…

Stable Diffusion绘画 | 文生图-高分辨率修复-Hires.fix

开启「高分辨率修复」的作用是&#xff0c;提高图片分辨率&#xff0c;增加细节&#xff0c;从而让画面变得更清晰。 之所以不采取直接通过调整宽高来提高分辨率&#xff0c; 是因为绝大多数模型在训练时&#xff0c;精度都是 512x512&#xff0c;如果生成图片时&#xff0c;直…

云仓酒庄新纪元:雷盛红酒LEESON 401澳洲赤霞珠盛大发布

云仓酒庄新纪元&#xff1a;雷盛红酒LEESON 401澳洲赤霞珠盛大发布 在全球酒业市场的激烈竞争中&#xff0c;云仓酒庄始终以其敏锐的市场洞察力和卓越的产品品质引领行业潮流。近日&#xff0c;云仓酒庄宣布其精心筹备的雷盛红酒LEESON 401系列——澳洲原瓶进口赤霞珠正式上线…

API 接口设计原则:RESTful 与 GraphQL

RESTful 接口 REST 的全称是 REpresentational State Transfer&#xff0c;是一种 Web API 的设计风格 RESTful API 设计 6 大原则 一个 RESTful 风格的接口应该满足如下的 6 点原则&#xff1a; 统一接口&#xff1a;For example, the HTTP-based REST APIs make use of th…