类和对象(下)
再谈构造函数
在类和对象(中)的时候我们已经大致的的了解了一点构造函数,但时的话构造函数在构造的时候有两种:
在前面我们已经重点讲解过构造函数赋值,现在重点放在初始化列表就好
构造函数赋值
在编辑对象时,给对象中各个成员变量一个合适的初始化
初始化列表
初始化列表格式:
class date
{
public://初始化列表格式date(int year,int month,int day) //初始化列表名和类名相同:_year(year) //()_year会初始化为(year),_month(month),_day(day){}
private:int _year;int _month;int _day;
};
需要注意的是:
1.每个成员函数在初始化列表中只出现一次
2.以下3类成员变量必须在初始化列表初始化:
— a.引用成员函数
—b.const成员变量
—c.自定义类型成员(该类没有默认构造函数时)
class date
{
public://初始化列表格式date(int year,int month,int day,int n,int ref) //初始化列表名和类名相同:_year(year) //()_year会初始化为(year),_month(month),_day(day),_n(n) //必须使用初始化列表初始化,_ref(ref) //必须使用初始化列表初始化{}
private:int _year;int _month;int _day;const int _n;int& _ref;
};
在这里有两个小知识点:
1.对于自定义类型来说,一定会先使用初始化列表进行初始化。
2.真正的初始化顺序 = 成员变量在类中声明的顺序。而不是初始化列表顺序
如:
#include <iostream>
using namespace std;class A {
public:A() { cout << "A构造\n"; }
};class B {
public:B() { cout << "B构造\n"; }
};class C {B b;A a;
public:C() : a(), b() {} // 初始化列表中先写 a,再写 b
};
static成员
static是声明的是静态成员,在内存中的存储位置在静态区,类中用static修饰后的成员变量叫做,静态成员变量。修饰的成员函数叫作静态成员函数。静态成员变量必须在类外进行定义,静态成员函数没有this指针。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>class date
{
public:date(int a, int b){_a = a;_b = b;}static int& Add(int a, int b) //静态成员函数{int c = a + b;return c;}private:static int _day;int _a;int _b;};int date::_day = 365; //在类外进行静态成员变量的定义int main()
{//静态成员函数的使用int total=date::Add(3,5); //使用::访问类中静态成员函数return 0;
}
特性:
1.静态成员为所有类和对象共享,不属于某个类;
2.静态成员变量必须在类外定义,定义时不需要加static,类中只是声明;
3.静态成员函数没有隐藏的this指针;
4.静态成员函数也是类的成员,同样受public,protected,private的限制
5.非静态成员函数可以调用静态成员函数,但是反过来不行;
友元
看一下代码:
class date
{
public:date(int year, int month, int day) //构造函数{_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;
};int main()
{date a(2025,4,26);cout<<a<<endl;return 0;
}
我们看一下,上面这一串代码能不能使用cout<<a<<endl;
进行打印?
答案是不行的
标准库中没有为该类型定义 operator<< 重载(流插入运算符)
这个时候我们就得自己实现:
1. operator<<重载函数不能写在类中,因为写在类中会有this指针,使得调用 << 只能a<<cout,可以编译但是不符合流插入的使用逻辑。
那我们这么办?答案时函数写在类外面,但是在类外要这么访问对象呢?这个时候就需要使用友元函数(friend)
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class date
{
public:friend std::ostream& operator<<(ostream& _cout, date a); //友元函数的声明date(int year, int month, int day) //构造函数{_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;
};std::ostream& operator<<(ostream& _cout, date a) //定义友元函数
{_cout << a._year << a._month << a._day << endl;return _cout;
}int main()
{date a(2025, 4, 26);cout << a << endl;return 0;
}
注意:
1.友元函数可以在类的任意地方声明,不受访问限制符限制;
2.友元函数调用和普通函数原理相同;