专栏首页cwl_JavaC++-面向对象(九)

C++-面向对象(九)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_42528266/article/details/102756467

友元
  • 友元包括友元函数和友元类
  • 如果将函数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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • AddressSanitizer算法及源码解析

    AddressSanitizer是Google用于检测内存各种buffer overflow(Heap buffer overflow, Stack buffe...

    Linux阅码场
  • java代码查错11道题

    大侠们,这有何错误? 答案: 错。abstract method必须以分号结尾,且不带花括号。

    框架师
  • C++11较C++03的改进

    一门语言如果太啰嗦了,不仅会为阅读带来障碍,而且还是许多错误的根源。所以从C语言继承而来的关键词auto在C++11中有了新的定义,可以进行自动类型推断。

    编程范 源代码公司
  • 学习OpenCV,新手常会问我的十个问题 | 视觉入门

    赶快去检查/配置环境变量,看看有没有把opencv_world+版本号d.dll所在路径到系统环境变量path中去,如果没有问题,重启VS即可

    磐创AI
  • Java:new一个对象的过程中发生了什么?

    java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。

    Java团长
  • Android SurfaceVeiw划矩形截屏存放到RecyclerView中

    前一篇文章《Android SurfaceView onTouchEvent进阶操作OpenCV显示》我们已经实现了在SurfaceView中划矩形显示在源图上...

    Vaccae
  • JAVA基础复习(重点)

    (2)一个.java源文件中可以声明多个类,但是只能有一个public修饰的类,文件名要和public修饰的类名保持一致;

    阮键
  • JavaSE笔记

    (2)一个.java源文件中可以声明多个类,但是只能有一个public修饰的类,文件名要和public修饰的类名保持一致;

    阮键
  • Vue 项目里戳中你痛点的问题及解决办法(下)

    作者:愣锤 https://juejin.im/post/5b174de8f265da6e410e0b4e

    Nealyang
  • 【C++语言】 cin和cout的详解

    cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象...

    编程范 源代码公司

扫码关注云+社区

领取腾讯云代金券