1.如何实现一个不可以被继承的类 (1)我们上一次介绍了这个相关的构造函数和析构函数的派生类的诸多使用注意事项,我们如何实现一个不可以被继承的类呢,下面介绍两个方式; (2)第一个就是使用的我们上次介绍的这个知识 上面介绍的就是一种直接的方式,我们下面介绍一种间接的不可以被继承的方式,就是使用的C++11里面提供的一个关键字final,这个就很直接了,因为这个时候只要我们继承这个父类,这个时候编译器就会报错; 2. 继承和友元函数 (1)这个地方只需要记住一句话,就是友元函数不可以被继承,如果子类里面也想要使用这个友元函数,我们就需要把这个函数定义为子类的友元,这个也是有办法解决的; (2)友元函数不属于任何一个类 子类里面继承父类的成员变量需要使用父类的构造函数进行初始化; 4.菱形(虚拟)继承 (1)单继承和多继承 单继承就是只有一个直接父类的继承关系; 多继承就是一个类有两个及以上的直接父类的继承关系; (2) base2的起始位置,而且可以访问的空间只有base2的范围,但是这个p3指针指向的位置就是这个空间的起始位置,但是这个指针可以访问的范围就会比较大,这个模型他是都可以进行访问的,因为这个指针是一个derive
2.非类型模板参数必须在编译期就能确认结果。 以下用法是错误的,因为N不确定。 template<class T1, class T2> class Data { public: Data() { cout << "Data<T1, T2>" << endl; } private template<class T1, class T2> class Data { public: Data() { cout << "Data<T1, T2>" << endl; } private 模板总结 模板的优点: 1.代码可以复用,节省资源,提高效率,便于更快迭代开发,C++标准模板(STL)因此而生。 2.代码更灵活。 模板的缺点: 1.代码膨胀,编译时间变长。 2.模板出现错误时,信息容易错乱,不利于排查。 拜拜,下期再见 摸鱼ing✨
这次带来的是C++中关于继承这部分的一些知识点,如果对你有所帮助的话,可否留下你宝贵的三连呢? 2. 菱形继承 菱形继承是多继承的一种特殊情况。 从这个点也可以看出,多继承算是c++的一个缺陷,在之后的一些编程语言里就没有多继承比如java。 多继承中指针偏移问题 接下来我们观察一段代码: class Student { public: int _b1; }; class Person { public: int _b2; }; class = &d; Assistant* p3 = &d; return 0; } p1、p2、p3都指向哪里?
) + (y) //#define ADD(x, y) ((x) + (y)); #define ADD(x, y) ((x) + (y)) 7.1 概念 以inline修饰的函数叫做内联函数,编译时C+ 2. 类型难于拼写 2. 8.2 auto简介 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的 是一直没有人去使用它,大家可思考下为什么? 指针空值nullptr(C++11) 10.1 C++98中的指针空值 在良好的 C/C++ 编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现 不可预料的错误,比如未初始化的指针
开发环境 开发工具 CLion(推荐): http://www.jetbrains.com/clion/ 需要安装下面的编译器 Visual Studio: https://visualstudio.microsoft.com /zh-hans/downloads/ 安装文件太大了 编译器 C++编译器:https://sourceforge.net/projects/mingw-w64/files/ 推荐下载:x86_64- posix-seh GNU 的 C/C++ 编译器 Cygwin 提供了一整套 可移植操作系统接口 (Portable Operating System Interface,缩写:POSIX)层。 开发的程序需要把依赖的 DLL 一起发布。 MinGW 是基于 Cygmin 开发的。重视性能优于兼容性,不需要提供兼容层,因为是直接调用 Windows API。 DWARF (DW2, dwarf-2):只能用于32位,没有永久的运行时开销,需要调用栈是dwarf-enabled,这意味着异常对于Windows system DLLs或Visual Studio
C++游戏开发概述 C++ 是游戏开发中的主要编程语言之一,因其性能、控制和广泛的生态系统而受到开发者的青睐。随着游戏行业的迅速发展,C++ 被用来构建许多成功的游戏和游戏引擎。 C++在游戏开发中的优势 1.1 性能 C++ 是一种高性能语言,允许开发者对系统资源进行精细控制,这在需要高帧率和低延迟的实时游戏中尤为重要。C++ 的编译特性使得代码执行速度快于许多解释型语言。 1.3 丰富的库和框架 C++ 拥有丰富的第三方库和游戏引擎,如 Unreal Engine、CryEngine 和 SDL,这些库和框架加速了开发过程,并提供了强大的功能支持。 2. Unity 适合快速开发和原型制作,提供了丰富的社区支持和资源。 3.3 SDL(Simple DirectMedia Layer) SDL 是一个简单直接的媒体层,适用于 2D 游戏开发。 掌握 C++ 和相关技术,可以帮助开发者创建丰富的游戏体验。随着技术的不断发展,C++ 将继续在游戏开发领域发挥重要作用。
C++模板开发分为两类: 模板函数开发 模板类开发 模板函数语法: template <class type> ret-type func-name(parameter list) { = 20.7; cout << "Max(f1, f2): " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2): " << Max(s1, s2) << endl; return 0; } 模板类语法: template Exception: " << ex.what() <<endl; return -1; } } 上面的模板函数和模板类的例子,都是定义和声明在同一个文件中,但是如果按照传统的C+ 当然,这个问题,也是有解决方案的,可以参考C++ 模板类的声明与实现分离问题 参考文献http://blog.csdn.net/u012750314/article/details/52770847
2 的幂 难度简单540收藏分享切换为英文接收动态反馈 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。 示例 1: 输入: n = 1 输出: true 解释: 20 = 1 示例 2: 输入: n = 16 输出: true 解释: 24 = 16 示例 3: 输入: n = 3 输出: false 示例 isPowerOfTwo(int n) { // n - 1就是把n的二进制位的最右边的那个1去掉 如果这个时候去掉了最右边的那个1 // 这个还是很妙的 如果n真的是2的幂的话
前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的 一、缺省函数 1.1什么是缺省函数 而在C++中,反而支持这种行为,这是为什么呢? 而在C++中就可以不用这么麻烦,直接float add(float a,float b);int add(int a,int b);完全不需要再去取新的名字,一个名字就搞定了,C++会自动识别参数的类型 通过图片可以看出,a是b,b也是a,b和a的本质是一样的 打印地址更是强有力的证明了我们的观点 必须重视的几点 1.引用在定义时必须要初始化 2.一个变量可以有多个引用,就像一个人可以有多个外号一样 2. 引用在定义时必须初始化,指针没有要求 3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体 4.
本篇介绍 本篇继续C++的模版介绍 std::enable_if<> enable_if<> 的作用是满足条件后可以使用模版推导,基于SFINAE(substitution failure is not
看看我们的这个编译器是如何进行扩容的; 我们可以发现,这个里面编译器一共是进行了4次扩容,第一次是以二倍的数量进行扩容,剩下的几次是以1.5倍的方式进行扩容的,这个是编译器决定的,例如在这个gcc编译器上面就是以2倍的方式进行扩容的 ; (2)上面的我们是使用的push_back函数插入数据,看看这个编译器是如何进行扩容的,实际上我们也是可以调用这个reserve函数进行扩容的: 我们这个时候就可以发现,我们使用reverse函数进行扩容的时候 函数是不会缩空间的,就是当我们开的空间过大的时候,他不会释放掉多余的空间,实际上就算是缩的话,代价也是很大的,因为这个缩的话也是异地进行的,就是先拷贝一份,然后在这个拷贝的缩小空间,再把原来的空间给释放掉; 2. ,经过这个at函数的加加变成了打印出来的j字符; 4.一些运算符的重载说明 (1)我们可以调用库里面的函数在这个尾部插入字符,例如我们可以调用这个append函数,push_back函数插入字符; (2) 模版的那个就是库里面提供的函数,我们使用swap(str2,str3)就会执行非成员函数,我们使用str2.swap(str3)就会执行成员函数,那个模版的库函数不会被使用到,这个也是当时设计的时候就考虑到的问题
A& pa, const B& pb); protected: int _a = 1; }; class B :public A { //public: protected: int _b = 2; Student { protected: string _seminarCourse; // 研究科目 }; void TestPerson() { Student s1; Student s2; _count) << " " << &(s2. }; class D : public B, public C { public: int _d; }; int main() { D d; d.B::_a = 1; d.C::_a = 2; 4 继承的总结和反思 在effective C++中提到,如果面临选择继承还是组合的时候,请优先选择组合,组合就是这样: class M { public: A _a; }; 也就是成员变量是其他自定义类型的
前言 之前我们深入探讨了模板的概念、重要性及其在C++编程中的应用: 【c++】模板详解(1)-CSDN博客 通过模板,我们实现了代码的复用,并且初步理解了泛型编程。 2. template<class T1, class T2> class A<T1&, T2&> { public: A(const T1& a,const T2& b) :_a(a) ,_b( 将声明和定义放在同一头文件当中(推荐) 2. 在定义位置进行显式实例化的声明(不推荐,很不实用) 四、模板优缺点总结 最后,我们总结一下c++中模板的优点和缺点: 优点 1. 可扩展性:模板提供了一种扩展C++语言的机制,可以通过在模板中添加特定的功能来扩展语言的能力(如STL),满足了复杂的应用需求。 缺点 1.
文本文件读取操作 读取文件操作: 1.包含头文件:#include< fstream > 2.创建流对象:ifstream ifs 3.打开文件,判断文件是否打开成功:ifs.open(“打开路径
2 单继承与多继承中的虚函数表 2.1 单继承中的虚表 单继承中的虚表在多态(1)里面已经提及到了,这里呢就简单过一下。 ) { cout << "Base1::func2" << endl; } private: int b1; }; class Base2 { public: virtual void func1 () { cout << "Base2::func1" << endl; } virtual void func2() { cout << "Base2::func2" << endl; } private : int b2; }; class Derive : public Base1, public Base2 { public: virtual void func1() { cout << " 这里呢,是因为有两个虚表指针,一个存放在Base1 一个存放在Base2里面,有人问,为什么派生类里面没有虚表指针?
= clock(); for (size_t i = 0; i < 10000; i++) Test2(a); size_t end2 = clock(); cout << "Test1-time : " << end1 - begin1 << endl; cout << "Test2-time: " << end2 - begin2<< endl; return 0; } 我们创建一个结构体 : " << end1 - begin1 << endl; cout << "Test2-time: " << end2 - begin2<< endl; return 0; } 返回值也是一样的道理 我们遍历一个数组通常采用for的方式: int main() { int arr[10] = { 0 }; for (int i = 0; i < 10; i++) { ; } return 0; } 在C+ 以上就是C到C++引入的一些小语法,感谢阅读!
C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。 ; Func1(1, 2, 3); Func2(100); Func2(100, 200); Func2(100, 200, 300); Func2(100, ,300);//错误 return 2. 函数重载是C++多态性的一种形式,它允许程序员使用相同的名字来执行相似的操作,这增强了代码的清晰性和可读性。 3.引用 3.1引用的概念和定义 在 C++ 中,引用是一个变量的别名。 C++的引用跟其他语言的引用(如Java)是有很大的区别的,除了用法,最大的点,C++引用定义后不能改变指向,java的引用可以改变指向。
int i=count % 10; //局部变量 cout<<"count % 10="<<i<<endl; //"count % 10="为字符串常量 } void func<em>2</em>( //静态局部变量 cout<<"out="<out<<endl; func1(); func<em>2</em>(); return 0; } 在这个例子中我尽量表现了各种情况,虽然写得很不合理… 先给出<em>C++</em>内存的一个模型图: ? 对于一个<em>C++</em>程序,内存区域分六个部分:依次是rodata区,text区,data区,bss区,heap区和stack区。 上面程序中的main函数和func1,func<em>2</em>中的非static类型的变量在调用时都会加载到该区域。
C++游戏开发:实现2D/3D游戏逻辑和渲染在游戏开发中,C++是一种广泛使用的高效编程语言。它提供了强大的功能和灵活性,适用于实现2D和3D游戏的逻辑和渲染。 以下是使用C++实现游戏逻辑的一般步骤:创建游戏窗口和事件循环:使用游戏开发框架(如SDL、SFML或OpenGL)创建游戏窗口,并设置一个主循环来监听用户输入和更新游戏状态。 renderGame(); // ...}通过上述步骤,你可以使用C++实现游戏渲染以呈现2D或3D图形。结论本篇博客介绍了使用C++实现2D/3D游戏逻辑和渲染的基本步骤。 了解这些基本原理和技巧对于从事游戏开发工作或学习游戏编程非常重要。希望这篇文章对你有所帮助,并激发你在游戏开发领域的创造力和热情!我们以一个简单的2D游戏为例,实现一个小球在窗口中的移动和碰撞检测。 这个简单的例子展示了使用C++实现2D游戏逻辑和渲染的基本思路和方法,你可以根据具体的需求和游戏规则来扩展和改进这个代码。当涉及到C++游戏开发,应用场景广泛且多样化。
direct2d windows direct3d的一个分支,效率比gdi款很多,而且支持硬件加速 参考:https://docs.microsoft.com/zh-cn/windows/win32/ direct2d/direct2d-portal? ocaml-cairo.git angle webgl的硬件支持接口 https://gitee.com/de-user/angle.git vulkan 支持硬件加速和cpu,imgui使用了vulkan的框架绘制2d