目录
c++中的const权限
void Print()
{
cout << _year << "-" << _mouth << "-" << _day << endl;
}
void f(const Date& d)
{
d.Print();
}
this指针为非const的,故需要
//void Print(const Date* this)
void Print() const
{
cout << _year << "-" << _mouth << "-" << _day << endl;
}
const的修饰规则
//const在*前 修饰指针指向的内容 *后修饰指针本身
//const Date* p1; *p1
//Date const* p2; *p2
//Date* const p3; p3
成员函数调用const成员函数
void f1()//void f1(Date* this)
{
f2();//this->f2(this); 正确
}
void f2() const
{}
//
void f3()
{}
void f4() const //void f4(const Date* this)
{
f3();//this->f(this); 错误
}
static成员
计算一个类中产生了多少对象
#include<iostream>
using namespace std;
int n = 0;
class A
{
public:
A()
{
++n;
}
A(const A& a)
{
++n;
}
};
A f1(A a)
{
return a;
}
int main()
{
A a1;//对象是由构造函数或拷贝构造产生的
A a2;
f1(a1);
f1(a2);
cout << n << endl;
return 0;
}
6个对象
A& f1(A& a)
{
return a;
}
2个对象
private:
static int n;//声明 n属于这个类的所有对象
int A::n = 0;//定义
提高代码的封装性。
static修饰成员函数
static int GetN()
{
//_a = 10;
return n;
}
private:
int _a;
没有this指针不能访问非静态成员。
static成员
1.static成员变量不存在对象中,存在静态区,属于这个类的所有对象,也是属于这个类。
2.static成员函数,没有this指针,不使用对象就可以调用。调用方式->类名::func();
3.static函数中,不能访问非静态成员(变量+函数)
void f1()
{}
static void f2()
{
//f1();
}
void f3()
{
f4();
}
static void f4()
{
//f1();
}
1. 静态成员函数可以调用非静态成员函数吗?
x 静态成员函数无this指针
2. 非静态成员函数可以调用类的静态成员函数吗?
√
对象创建+static成员函数的练习
class Sum
{
public:
Sum()
{
sum+=i;
++i;
}
static int GetSum()
{
return sum;
}
private:
static int i;
static int sum;
};
int Sum::i=1;
int Sum::sum=0;
class Solution {
public:
int Sum_Solution(int n) {
Sum s[n];
return Sum::GetSum();
}
};
初始化列表
类中包含以下成员,必须放在初始化列表位置进行初始化:
引用成员变量
const成员变量
自定义类型成员(该类没有默认构造函数)
突破类域的两种方式 编译时可以知道去那个域找+访问限定符是否可以访问
编译时可以知道去那个域找
对象.方法
类名::(域作用限定符)方法
类中成员的声明
private:
static int i;
static int sum;
类里面均为声明。
静态成员变量只能类里面声明,类外面定义。
//c++11-------------->声明时给缺省值。
int _a=0;
初始化只能发生在定义时。
static int n;
静态的不允许。规定:静态成员应在类外定义。
B b = 20;
涉及隐式类型转换
int* p = (int*)malloc(4);
友元
友元分为:友元函数和友元类
类外面访问私有或保护成员的一种方式。
友元函数
void operator<<(ostream& out)
{
cout << _year << "/" << _mouth << "/" << _day << endl;
}
Date d1;
d1.operator<<(cout);
d1 << cout;
代码可读性差。
class Date
{
friend ostream& operator<<(ostream& out, const Date& d);
public:
private:
int _year=0;
int _mouth=1;
int _day=1;
};
ostream& operator<<(ostream& out,const Date& d)
{
cout << d._year << "/" << d._mouth << "/" << d._day << endl;
return out;
}
Date d1;
cout << d1 ;
cout是标准库std命名里的一个ostream类型的全局对象.
<<是一个运算符。
友元类
class Time
{
friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成
员变量
public:
Time(int hour, int minute, int second)
: _hour(hour)
, _minute(minute)
, _second(second)
{}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
: _year(year)
, _month(month)
, _day(day)
{}
void SetTimeOfDate(int hour, int minute, int second)
{
// 直接访问时间类私有的成员变量
_t._hour = hour;
_t._minute = minute;
_t.second = second;
}
private:
int _year;
int _month;
int _day;
Time _t;
};
内部类
class A
{
private:
static int k;
int h;
public:
class B
{
public:
void foo(const A& a)
{
cout << k << endl;//OK
cout << a.h << endl;//OK
}
};
};