C++日期类详解:构造函数与析构函数

需积分: 9 0 下载量 84 浏览量 更新于2024-08-19 收藏 519KB PPT 举报
在C++编程中,"构造函数已被调用。"这句话通常出现在一个类的实例化过程中,当一个对象被创建时,构造函数会自动执行,用于初始化对象的数据成员并可能执行其他必要的设置。例如,在给定的"日期类TDate"中,定义了一个构造函数: ```cpp TDate(int y, int m, int d) { year = y; month = m; day = d; } ``` 这个构造函数接受三个整数参数,分别表示年、月、日,然后将这些值赋给私有数据成员`year`, `month`, 和 `day`。当你声明一个`TDate`类型的对象时,如`TDate date(2023, 2, 24);`,系统会隐式地调用该构造函数。 类和对象是C++编程的核心概念。在C++中,类是一种用户自定义的数据类型,用来封装数据和操作这些数据的行为。类定义包含了私有、保护和公共部分,分别用于控制不同权限的数据和方法。在这个例子中,`TDate`类包含了私有成员`year, month, day`,它们是通过公有成员函数`SetDate()`设置的,以及`IsLeapYear()`和`print()`,用于判断是否为闰年和打印日期。 析构函数`~TDate()`是一个特殊的方法,当对象的生命期结束,即将被销毁时,析构函数会被调用。在给定的代码片段中,析构函数会在对象删除时输出"析构函数被调用。" 类的生命周期管理还包括拷贝构造函数,虽然在给定的代码中没有明确显示,但若需要复制一个已有对象,拷贝构造函数会被自动调用。拷贝构造函数用于创建新对象时,将已有对象的状态完整地复制到新对象。 此外,还提到了局部类和嵌套类,这是类的另一种组织形式,可以提供更细粒度的访问控制。而引用和常量类型则是C++中的其他特性,引用提供了一种间接访问数据的方式,而常量类型则确保了变量值的不变性。 总结来说,这段代码展示了如何定义和使用一个简单的C++类`TDate`,包括构造函数、析构函数以及成员函数的使用,这些都是类和对象概念的重要组成部分。同时,也涉及到了数据成员的初始化规则、类的定义格式以及相关的编程实践。理解并掌握这些基础知识对于编写高效且可维护的C++程序至关重要。

#include<iostream> using namespace std; class student { public: //友元函数可以访问类中的公有和私有成员,不可以访问保护成员 friend void func2(student& s); friend class teacher; int a = 10; student(int x); ~student(); void func3(); private: int b = 20; }; student::student(int x) :a(x) { cout << "student 构造函数调用1" << endl; } student::~student() { cout << "student 析构函数调用!" << endl; } void student::func3() { cout << b << endl; } class teacher { public: int a = 1; student p; teacher(int a); ~teacher(); }; teacher::teacher(int a) { cout << "teacher构造函数调用" << endl; this->a = a; // p = new student(100); } teacher::~teacher() { cout << "teacher析构函数调用" << endl; // delete p; } void func1() { student s1(100); cout << s1.a << endl; s1.func3(); func2(s1); cout << s1.a << endl; } //友元函数,全局函数做友元 //在形参中加入const防止传入的参数被改变,不加const则可以改变 void func2( student &s) { //传入普通类对象不可以改变类中的值,只能改变形参类的值 /*s.a = 123; cout<<s.a << endl; cout << s.b << endl;*/ ////传入指针可以改变类的值 /*s->a = 1000; s->b = 123; cout << s->a << endl; cout << s->b << endl;*/ ///传入引用也可以改变类中的值 //s.a = 12345; //s.b = 123456; cout << s.a << endl; cout << s.b << endl; } //类做友元 void func3() { student s1(10); cout << s1.a << endl; teacher t1(100); cout << t1.a << endl; //t1.p->a = 123456; cout << t1.p.a<< endl; } int main() { //成员函数做友元 //func1(); //类做友元 func3(); system("pause"); return 0; }

2023-06-08 上传

#include<iostream> using namespace std; class student; class teacher { public: int a = 1; student *p; teacher(int a); ~teacher(); }; teacher::teacher(int a) { cout << "teacher构造函数调用" << endl; this->a = a; p = new student; } teacher::~teacher() { cout << "teacher析构函数调用" << endl; delete p; } class student { public: //友元函数可以访问类中的公有和私有成员,不可以访问保护成员 friend void func2(student &s); friend class teacher; int a = 10; student(int x); ~student(); void func3(); private: int b = 20; }; student::student(int x) :a(x) { cout << "student 构造函数调用1" << endl; } student::~student() { cout << "student 析构函数调用!" << endl; } void student::func3() { cout << b << endl; } void func1() { student s1(100); cout << s1.a << endl; s1.func3(); func2(s1); cout << s1.a << endl; } //友元函数,全局函数做友元 //在形参中加入const防止传入的参数被改变,不加const则可以改变 void func2( student &s) { //传入普通类对象不可以改变类中的值,只能改变形参类的值 /s.a = 123; cout<<s.a << endl; cout << s.b << endl;/ ////传入指针可以改变类的值 /s->a = 1000; s->b = 123; cout << s->a << endl; cout << s->b << endl;/ ///传入引用也可以改变类中的值 //s.a = 12345; //s.b = 123456; cout << s.a << endl; cout << s.b << endl; } //类做友元 void func3() { student s1(10); cout << s1.a << endl; teacher t1(100); cout << t1.a << endl; cout << t1.p->a<< endl; } int main() { //成员函数做友元 //func1(); //类做友元 func3(); system("pause"); return 0; }

2023-06-08 上传

#include<iostream> using namespace std; class student; class teacher { public: int a = 1; student *p; teacher(int a); ~teacher(); }; teacher::teacher(int a) :a(a) { cout << "teacher构造函数调用" << endl; ///p = new student; } teacher::~teacher() { cout << "teacher析构函数调用" << endl; } class student { public: //友元函数可以访问类中的公有和私有成员,不可以访问保护成员 friend void func2(student &s); friend class teacher; int a = 10; student(int x); ~student(); void func3(); private: int b = 20; }; student::student(int x) :a(x) { cout << "student 构造函数调用1" << endl; } student::~student() { cout << "student 析构函数调用!" << endl; } void student::func3() { cout << b << endl; } void func1() { student s1(100); cout << s1.a << endl; s1.func3(); func2(s1); cout << s1.a << endl; } //友元函数,全局函数做友元 //在形参中加入const防止传入的参数被改变,不加const则可以改变 void func2( student &s) { //传入普通类对象不可以改变类中的值,只能改变形参类的值 /*s.a = 123; cout<<s.a << endl; cout << s.b << endl;*/ ////传入指针可以改变类的值 /*s->a = 1000; s->b = 123; cout << s->a << endl; cout << s->b << endl;*/ ///传入引用也可以改变类中的值 //s.a = 12345; //s.b = 123456; cout << s.a << endl; cout << s.b << endl; } //类做友元 void func3() { student s1(10); cout << s1.a << endl; teacher t1(100); cout << t1.a << endl; cout << t1.p->a<< endl; } int main() { //成员函数做友元 //func1(); //类做友元 func3(); system("pause"); return 0; }

2023-06-08 上传