1. const 成员函数概念
2. const 成员函数格式
[返回值类型] 函数名(形参列表) const
{
函数体
}
.3. const 成员函数示例
class date
{
public:
date(int year = 1, int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
{}
void Print() const
{
// const 修饰隐含的 this 指针,防止改变对象的内容
// 只想打印对象 d 内的值,不期望也不允许去改变
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
const date d(2024, 2, 8); // const 修饰的对象 d 的值不允许被改变
d.Print();
return 0;
}
4. const 成员函数特点
1. static 静态成员概念
class date
{
public:
date(int month, int day)
{
_month = month;
_day = day;
}
private:
static int _year;
int _month;
int _day;
};
int date::_year = 2024; // _year 是静态成员变量,只能在类外初始化
int main()
{
date d(2, 8);
return 0;
}
static 静态成员特性
class date
{
public:
date(int year = 1, int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
{}
// 将外部函数 Display 声明成 date 类的朋友
friend void Display(const date& d);
private:
int _year;
int _month;
int _day;
};
void Display(const date& d)
{
// Display 函数是 date 类的朋友的话就能使用 date 类的私有成员了
printf("%d-%d-%d\n", d._year, d._month, d._day);
}
int main()
{
date d(2024, 2, 8);
Display(d);
return 0;
}
class Time
{
public:
friend class Date; // Time 认为 Date 是它的朋友
// 但 Date 不认为 Time 是它的朋友,Time 无法使用 Date 的非公有成员
Time(int hour = 1, int minute = 1, int second = 1)
:_hour(hour)
,_minute(minute)
,_second(second)
{}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
Date(int year = 1, int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
{}
// Date 没有对 Time 进行友元类声明
// Date 可以使用 Time 的非公有成员
void PrintTime(const Time& t)
{
printf("%d-%d-%d\n", t._hour, t._minute, t._second);
}
private:
int _year;
int _month;
int _day;
};
内部类概念
内部类特性
内部类实例化方式
外部类::内部类 实例化的对象;
内部类示例
class A
{
public:
class B // B 天生就是 A 的友元类
{
public:
void Print(const A& a)
{
cout << a.h << k << endl;
// 内部类可直接访问外部类的 static 成员
}
};
private:
int h;
static int k;
};
int A::k = 1;
int main()
{
A::B b;
b.Print(A());
return 0;
}
匿名对象概念
匿名对象示例
class A
{
public:
A(int a)
:_a(a)
{
cout << "A(int a)" << endl;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _a;
};
int main()
{
A(5); // 匿名对象存在的意义就是为了传一下参数,所以生命周期只有 1 行
// 等到了下一行会立马调用析构函数
return 0;
}