Time.hpp

//
//  Time.hpp
//  stud
//
//  Created by pt on 2024/4/8.
//

#ifndef Time_hpp
#define Time_hpp
//类声明
#include <iostream>
using namespace std;
class Time
{
private:
    int Millisecond;
    void initMillTime(int mls);//成员函数的声明 -- 配套成员函数的实现
public:
    int Hour;
    int Minute;
    int Second;
    Time(int tmphour, int tmpmin, int tmpsec);//构造函数
    Time();//构造函数
    void initTime(int tmphour, int tmpmin, int tmpsec);//成员函数的声明 -- 配套成员函数的实现
    void show(){std::cout << "hahaha" << std::endl;}//成员函数的定义
};

#endif /* Time_hpp */

Time.cpp

//
//  Time.cpp
//  stud
//
//  Created by pt on 2024/4/8.
//

#include "Time.hpp"
Time::Time(int tmphour, int tmpmin, int tmpsec)//构造函数的实现
{
    Hour = tmphour;
    Minute = tmpmin;
    Second = tmpsec;
    
    initMillTime(0);//⬇️
}
Time::Time()//构造函数的实现
{
    Hour = 12;
    Minute = 59;
    Second = 59;
    initMillTime(59);
}
void Time::initMillTime(int mls)//成员函数的实现-- 配套成员函数的声明
{
    Millisecond = mls;//私有成员
}

main.cpp

#include <iostream>
#include "Time.hpp"
using namespace std;
int main()
{
    //Time myTime;//此条语句失效,没有对应的构造器为其初始化
    Time myTime(11, 14, 5);//构造函数初始化
    Time myTimea;//无参构造函数初始化
    
    
    Time(12,13,52);//创建了一个临时的 Time对象,但这个对象并不会绑定到任何变量上,因此它在表达式结束后立即被销毁。这种语句通常用于临时对象的创建,例如在函数调用中传递匿名对象。
    //如果你想在 main 函数中创建一个 Time 对象并保持它存在,你需要给这个对象命名,例如:Time myTime(12,13, 15);
    Time{12,13,15};//同理,创建了一个临时对象

    Time myTime1(12, 13, 52);//直接初始化
    Time myTime1a;//直接初始化,无参
    
    Time myTime2{12, 13, 52};//列表初始化 不允许缩窄变换,允许对于聚合类型(如数组、结构体等)提供初始化
    Time myTime2a{};//列表初始化 无参 不允许缩窄变换,允许对于聚合类型(如数组、结构体等)提供初始化
    
    Time myTime3 = Time(12, 13, 52);//在C++98旧标准下可能会创建一个临时对象然后复制给 myTime,但在C++11新标准下,拷贝/移动构造通常会被优化掉,直接在 myTime 的存储位置构造对象。
    Time myTime3a = Time();//调用无参的构造函数,在C++98旧标准下可能会创建一个临时对象然后复制给 myTime,但在C++11新标准下,拷贝/移动构造通常会被优化掉,直接在 myTime 的存储位置构造对象。
    
    Time myTime4 = Time{12, 13, 52};//在C++98旧标准下可能会创建一个临时对象然后复制给 myTime,但在C++11新标准下,拷贝/移动构造通常会被优化掉,直接在 myTime 的存储位置构造对象。
    Time myTime4a = Time{};//调用无参的构造函数,在C++98旧标准下可能会创建一个临时对象然后复制给 myTime,但在C++11新标准下,拷贝/移动构造通常会被优化掉,直接在 myTime 的存储位置构造对象。
    
    Time myTime5 = {12, 13, 52};//用到隐式类型转化,把花括号中的参数进行隐式类型转换,以创建一个 Time 对象,并将其赋值给 myTime5
    Time myTime5a = {};//省略了 无参 Time myTime5a = Time{};
    
    //不允许Time myTime5 = (12, 13, 52);因为这里使用的是圆括号,而且在圆括号中使用了逗号运算符。在 C++ 中,逗号运算符是一个顺序点,它会按照从左到右的顺序计算表达式,然后返回最后一个表达式的结果。因此,(12, 13, 52) 会先计算 12,然后是 13,最后计算 52 并返回 52。这个表达式的结果是 52,而不是一个三元素的列表。因此,编译器会试图使用单个整数 52 来初始化 myTime5 对象,这当然会失败,除非 Time 类定义了一个接受单个整数参数的构造函数。
    //对象的复制 不调用构造函数
    Time myTime6  = myTime;
    Time myTime7(myTime);
    Time myTime8{myTime};
    Time myTime9 = {myTime};


    
    //每个对象都有不同的内存地址
    std::cout << "初始化部分" << std::endl;
    std::cout << &myTime << '\n'<< &myTimea << '\n' << &myTime1 << '\n' << &myTime1a << '\n'<< &myTime2 << '\n' << &myTime2a << '\n'<< &myTime3 << '\n' << &myTime3a << '\n'<< &myTime4 << '\n' << &myTime4a << '\n'<< &myTime5 << '\n' << &myTime5a << '\n' << std::endl;
    std::cout << "复制部分" << std::endl;
    std::cout<< &myTime6 << '\n' << &myTime7 << '\n' << &myTime8 << '\n' << &myTime9 << '\n' << std::endl;
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐