友元
- 友元包括友元函数和友元类
- 如果将函数A(非成员函数)声明为类C的友元函数,那么函数A就能直接访问类C对象的所有成员
- 如果将类A声明为类C的友元类,那么类A的所有成员函数都能直接访问类C对象的所有成员
- 友元破坏了面向对象的封装性,但在某些频繁访问成员变量的地方可以提高性能
#include <iostream>
using namespace std;
class Point {
// friend Point add(const Point &, const Point &);
friend class Math;
private:
int m_x;
int m_y;
public:
int getX() const { return this->m_x; };
int getY() const { return this->m_y; };
Point(int x, int y) :m_x(x), m_y(y) { }
};
class Math {
public:
Point add(const Point &point1, const Point &point2) {
return Point(point1.m_x + point2.m_x, point1.m_y + point2.m_y);
}
};
//Point add(const Point &point1, const Point &point2) {
// return Point(point1.m_x + point2.m_x, point1.m_y + point2.m_y);
//}
int main() {
Point point1(10, 20);
Point point2(20, 30);
Point point = add(point1, point2);
cout << endl;
getchar();
return 0;
}
内部类
- 如果将类A定义在类C的内部,那么类A就是一个内部类(嵌套类)
- 内部类的特点
- 支持public、protected、private权限
- 成员函数可以直接访问其外部类对象的所有成员(反过来则不行
- 成员函数可以直接不带类名、对象名访问其外部类的static成员
- 不会影响外部类的内存布局
- 可以在外部类内部声明,在外部类外面进行定义
#include <iostream>
using namespace std;
// Person
class Person {
private:
static int ms_legs;
static void other() {
}
int m_age;
void walk() {
}
// Car
class Car {
int m_price;
public:
Car() {
cout << "Car()" << endl;
}
void run() {
Person person;
person.m_age = 10;
person.walk();
ms_legs = 10;
other();
}
};
public:
Person() {
cout << "Person()" << endl;
Car car;
}
};
int Person::ms_legs = 2;
class Point {
class Math {
void test();
};
};
void Point::Math::test() {
}
int main() {
cout << sizeof(Person) << endl;
Person person;
Person::Car car;
getchar();
return 0;
}
局部类
- 在一个函数内部定义的类,称为局部类
- 局部类的特点
- 作用域仅限于所在的函数内部
- 其所有的成员必须定义在类内部,不允许定义static成员变量
- 成员函数不能直接访问函数的局部变量(static变量除外)
#include <iostream>
using namespace std;
int g_age = 20;
void test() {
int age = 10;
static int s_age = 30;
// 局部类
class Person {
public:
static void run() {
g_age = 30;
s_age = 40;
cout << "run()" << endl;
}
};
Person person;
Person::run();
}
int main() {
test();
getchar();
return 0;
}
类型转换
- C++中建议使用C++的类型转换符取代C风格的强制类型转换
- C++中有4个类型转换符:static_cast、dynamic_cast、reinterpret_cast、const_cast