跟着龙之介学C#/C++
文章平均质量分 70
用于学习C++和C#常用用法和面经整理
游戏开发龙之介
自跨专业学编程的萌新
展开
-
C++新特性--函数对象包装器 function
C++11 std::function 是一种通用、多态的函数封装,它的实例可以对任何可以调用的目标实体进行存储、复制和调用操作,它也是对 C++中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的),换句话说,就是函数的容器。当我们有了函数的容器之后便能够更加方便的将函数、函数指针,lambda表达式作为对象进行处理。...原创 2022-06-24 13:26:07 · 297 阅读 · 1 评论 -
C++新特性篇 - Lambada表达式
捕获列表比较特殊,所谓捕获列表,其实可以理解为参数的一种类型,Lambda 表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,这时候捕获列表可以起到传递外部数据的作用。有如下几种......原创 2022-06-24 13:11:32 · 575 阅读 · 0 评论 -
C++ 内存对齐详解加配图分析
C++内存对齐因为cpu在存取指令的时候,以字节长为单位进行存取,32位机器默认字节长4字节,64位机器默认长8字节。cpu每次读取都从对齐字节的整数倍开始读取,而存放数据cpu以对齐字节的整数倍进行存放,这要求我们对struct或class内的数据排布提出了要求。看这样一段代码struct A的大小占比为12字节而struct B的大小占10字节而struct C的大小占8字节?(为啥一个char c需要8字节?==》因为内存对齐是按成员变量中sizeof最大值作为对齐条件)内存对齐规律一般来说,原创 2022-06-09 18:03:53 · 284 阅读 · 0 评论 -
《Effective C++》全局概述篇
C++可以视为由相关次语言组成的联邦,每个次语言都有自己的规约。大致分为四个:C:C++仍然是以C为基础。区块,语句,预处理,内置数据类型,数组,指针都是来自CObject-Oriented C++:面向对象设计。封装,继承,多态,虚函数,析构构造。Template C++:泛型编程。templates威力强大,可以带来崭新的编程范型。STL:标准模板程序库。他对容器,迭代器,算法以及函数对象的规约有极佳的紧密配合与协调。#define用于常量的场景缺点:a. #define定义的常量导致编译出错原创 2022-06-04 22:56:17 · 794 阅读 · 0 评论 -
《Effective C++》总结篇(实现)
大多数情况下,适当提出你的classes(和class template)定义以及functions(和function templates)声明,是花费最多心力的两件事。一旦正确完成它们,相应的实现大多直接了当。尽管如此,还是需要注意某些东西:看这一段代码,我们调用CreateStr函数。返回一个res但是,如果temp的长度太小的话,就会因为异常导致res后续不处理。相当于res无端的进行了构造和析构,但是没有被使用,这非常浪费所以我们尽可能要在我们需要使用的时候再用它。即改成:你应该尝试延后原创 2022-06-04 22:13:31 · 269 阅读 · 0 评论 -
《Effective C++》 总结篇(杂项讨论)
《Effective C++》 总结篇(杂项讨论)原创 2022-06-04 21:10:55 · 138 阅读 · 0 评论 -
《Effective C++》 总结篇(定制new和delete)
本章主要唠嗑一下new和delete。当operator new抛出异常以反应未获满足的内存需求之前会先调用new-handle。客户可以指定这个“用以处理内存不足”的函数,客户必须调用set_new_handler。(在标准库)本例代码就是不断生成内存直到用尽,而抛出异常。为了防止当operator无法满足内存申请时反复调用new-handler函数,我们需要做以下事情:1.让更多内存被使用。(调用new-handler之后将资源释放)2.安装另一个new-hander。(当前的new-hander原创 2022-06-03 18:46:50 · 217 阅读 · 0 评论 -
《Effective C++》 总结篇(模板与泛型编程)
条款四十一:了解隐式接口的和编译期多态和面向对象编程的显示接口和运行期多态不同,泛型编程更多是隐式接口和编译期多态。#include <iostream>using namespace std;class A{public: A() { x = 12; cout << "Create A" << endl; } virtual std::size_t size() const { return x; } virtual void Init() { x原创 2022-05-30 22:42:42 · 297 阅读 · 0 评论 -
《Effective C++》总结篇(继承与面向对象设计)
条款三十二:确定你的public继承塑模出is-a关系如果你令class D(“Derived”)以public形式继承class B(“Base”),你便是告诉C++编译器(以及你的代码读者)说,每一个类型为D的对象同时也是一个类型为B的对象,反之不成立。你的意识是B比D表现出更一般化的概念,而D比B表现出更特殊化的概念。你主张“B对象可派上用场的任何地方,D对象一样可以派上用场”,因为每一个D对象都是一种B对象。反之如果你需要一个D对象,B对象无法效劳,虽然每个D对象都是一个B对象,反之并不成立。每原创 2022-05-28 19:46:50 · 168 阅读 · 0 评论 -
《Effective C++》总结篇(设计与声明)
条款十八:让接口容易被使用,不易被误用1.我们应该预防“接口被误用”。假设有这么一个构造函数#include <iostream>using namespace std;class Data{public: Data(int month, int day, int year) {}};int main(){ Data d1(30, 3, 1995);//正确 Data d2(1995, 30, 3);//无效的年月日! return 0;}为了防止他们被误用,所原创 2022-05-20 21:20:53 · 242 阅读 · 0 评论 -
《Effective C++》总结篇(资源管理)
所谓资源就是你用了它就一定要还回去,不然会产生很多问题。全篇围绕着RAII(Resource Acquisition Is Initialiaztion)模式结合智能指针进行讲述如何管理资源条款十三:以对象管理资源我们创建了对象之后,很可能会忘记delete它,或者因为某些原因无法delete它,最后导致内存泄漏。为了确保资源总是会被释放的,我们需要将对象资源放进对象内,当控制流离开,对象的析构函数会自动释放掉这些资源。故依赖C++的析构函数自动调用机制,确保资源被释放。智能指针auto_ptr正原创 2022-05-16 20:23:14 · 259 阅读 · 0 评论 -
《Effective C++》总结篇)构造/析构/赋值运算
条款五:了解C++默默编写并调用哪些函数如果你自己没声明,编译器就会为它声明一个copy构造函数,一个copy assignment操作符,一个析构函数和一个default构造函数,并且都是public和inline的#include <iostream>using namespace std;class A{};int main(){ A a; //构造函数 A a1(a);//copy 构造函数 a1 = a;//copy assignment函数原创 2022-05-15 17:09:17 · 267 阅读 · 0 评论 -
《Effective C++》总结篇(让自己习惯C++)
条款一:视C++为一个语言联邦条款二:尽量以const,enum,inline替换#define条款三:尽可能使用const条款四:确定对象被使用前已先被初始化原创 2022-05-14 18:15:35 · 298 阅读 · 0 评论 -
bitwise const和logic constness---龙之介《Effective C++》实验室
条款3:尽可能使用const1 bitwise const成员函数如果是const意味着什么?有个所谓的bitwise const 的说法。即编译器认为,const成员函数不可以更改对象内任何non-static成员变量。但是一个更改了“指针所指物”的成员函数虽然不能算const,但如果只有指针(而非其所指物)隶属于对象,那么称此函数为bitwise const 不会引起编译器异议。说人话就是,理论上 const成员函数 表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改原创 2021-06-03 17:57:37 · 921 阅读 · 2 评论 -
C++ 指针和引用的区别
★相同点:●都是地址的概念;●指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。★不同点:●指针是一个实体,而引用仅是个别名;●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可原创 2022-05-08 20:50:10 · 66 阅读 · 0 评论 -
重写和重载的区别
重写:overrider 重写也就是我们通常所说的覆盖,重写是指在派生类当中,重新对基类中的虚函数度重新实现。重载:重载指的是不用的函数使用相同的函数名字,可是,函数的参数、个数或者是类型都不同。定义不同—重载是定义相同的方法名,参数不同;重写是子类重写父类的方法范围不同—重载是在一个类中,重写是子类与父类之间的多态不同—重载是编译时的多态性,重写是运行时的多态性返回不同—重载对返回类型没有要求,而重写要求返回类型,有兼容的返回类型参数不同—重载的参数个数、参数类型、参数顺序可以不同,而重写父子原创 2022-04-30 21:30:11 · 225 阅读 · 0 评论 -
c++钻石继承重复继承解决方案,以及啥是vfptr和bfptr
重复继承 novirtual+novirtualB继承A,而C也继承A。然后D继承B和C。这样就称为重复继承,因为看着像个菱形,所以也叫钻石继承那么这样继承会出现什么问题呢?我们先从内存分配的角度看。在VS使用 / d1 reportSingleClassLayoutXXX就能查看内存分配。具体如下:运行之后就能看到XXX类这里是VirClass类的分布情况。好的,切回正题。假设我们有个这样的代码正如刚刚那个继承图一样:B继承A,而C也继承A。然后D继承B和C。#include原创 2022-03-19 18:00:45 · 1219 阅读 · 0 评论 -
指针数组,数组指针,指针函数,函数指针配合代码详细介绍
指针数组故名思意,本质是个数组,类似整数数组,字符数组一样,指针数组中的所有元素均为指针char *p[4];这就是一个指针数组,[]的优先级大于*。所以p先与[]结合形成数组,最后再与char*(指针)结合形成指针数组代码详解#include<iostream>using namespace std;int main(){ char* p[4];//指针数组:p是一个数组,数组里面类型为指针类型。 string str="1234"; puts("str原创 2021-12-06 20:35:49 · 455 阅读 · 0 评论 -
继承有什么优缺点?
优点:● 提高代码的重用性:代码重用,减少创建类的工作量,每个子类都拥有父类的方法和属性;直接将已有的属性和行为继承过来,实现了功能的复用,节省了大量的工作。● 提高代码的易维护性:不同类之间的继承关系,让这些事务之间保持一定程度的一致性,大大降低了维护成本● 提高代码的可扩展性:在已有功能的基础上,更容易建立,扩充新的功能;扩展接口都是通过继承父类来完成的;● 使代码结构清晰:同属于一个继承体系的相关类,他们之间结构层次清晰,简化了人们对代码结构的认识。缺点:● 高耦合性:类与类之间紧密的结合原创 2021-11-29 15:17:34 · 1578 阅读 · 0 评论 -
C++ 各种Mutex详解
Mutex互斥锁解释mutex 类是能用于保护共享数据免受从多个线程同时访问的同步原语。mutex 提供排他性非递归所有权语义:调用方线程从它成功调用 lock 或 try_lock 开始,到它调用 unlock 为止占有 mutex 。线程占有 mutex 时,所有其他线程若试图要求 mutex 的所有权,则将阻塞(对于 lock 的调用)或收到 false 返回值(对于 try_lock ).调用方线程在调用 lock 或 try_lock 前必须不占有 mutex 。若 mutex 在仍为原创 2022-02-13 14:05:00 · 5875 阅读 · 0 评论 -
c#和unity中用的c#的差距
c#是由微软开发的,属于所谓的面向对象编程语言。它是用来使用. net framework开发应用程序的,这个平台提供了广泛的类库、编程接口和实用程序。然而,Unity将该语言与.net框架的开源变种Mono框架结合使用,这意味着c#应用程序也可以在非microsoft系统上运行(也称为Mono项目)。...原创 2021-10-31 12:31:31 · 2640 阅读 · 0 评论 -
C# 深拷贝 浅拷贝 拆箱 装箱
数据分为基本数据类型和对象数据类型。1、基本数据类型的特点:直接存储在栈(stack)中的数据2、引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。浅拷贝与深拷贝深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对原创 2021-10-31 12:36:16 · 181 阅读 · 0 评论 -
基类的析构函数应该声明为虚函数
代码举例环节我们先看一下不申明为虚函数的析构函数的调用情况#include<iostream>using namespace std;class Human{public: Human() {}; ~Human() {cout << "析构 Human!" << endl;}; void Attack() { cout << "Human! Attack" << endl; };};class Hero :原创 2021-12-01 16:52:38 · 499 阅读 · 0 评论 -
C++ 中struct和class的区别
C++ 中保留了C语言的 struct 关键字,并且加以扩充。在C语言中,struct只能包含成员变量,不能包含成员函数。而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。C++中的 struct 和 class 基本是通用的,唯有几个细节不同:使用 class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public属性的。class 继承默认是 private 继承,而 struct 继承默认是 .原创 2021-12-02 11:56:51 · 178 阅读 · 0 评论 -
c++ 四种智能指针介绍以及均手撸代码实现
C++11智能指针介绍智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。只有引用计数为0时,智能指针才会自动释放引用的内存资源。对shared_ptr进行初始化时不能将一个普通指针直接赋值给智能指针,因为一个是指针,一个原创 2021-10-31 12:56:14 · 263 阅读 · 0 评论 -
C++ 多态介绍详解
多态按字面的意思就是多种形态。同一个事物在不同场景下的多种形态,即调用同一函数会产生不同的行为。C++多态又分为两种编译期多态和运行期多态:1.在面向对象C++编程中,多态是面向对象三大特性之一(封装,继承,多态),他的原理是通过虚函数机制,在运行期间通过虚函数表指针与虚函数表去确定该虚函数的真正实现,所以这种多态被称为运行期多态。2.在泛型编程,多态基于template的巨现化与函数的重载解析。这种多态在编译器进行,所以这种多态被称为编译期多态。3.函数重载解析也是编译器多态。运行期多态程序在原创 2021-11-24 16:20:37 · 879 阅读 · 0 评论 -
异常捕获详解
异常关键字try 用于检查发生的异常,并帮助发送任何可能的异常。catch 以控制权更大的方式处理错误,可以有多个catch子句。finally 无论是否引发了异常,finally的代码块都将被执行。throw 用于引发异常,可引发预定义异常和自定义异常。怎么做到捕捉异常的程序运行时常会碰到一些异常情况,例如:做除法的时候除数为 0;用户输入年龄时输入了一个负数;用 new 运算符动态分配空间时,空间不够导致无法分配;访问数组元素时,下标越界;打开文件读取时,文件不存在。这些异常情原创 2021-10-31 12:58:30 · 275 阅读 · 0 评论 -
类在堆中的结构 ?(从 成员 成员函数 虚表的指针 考虑)
前言heap和stack在C++标准中相对术语分别是自由存储(free store,即用new创建对象时所分配的空间)和自动变量(automaticvariable,或称局部变量)从编程的角度,要分开两者,是因为两者的生命周期不一样。1,自动变量会在作用域(如函数作用域,块作用域)结束后析构释放内存。因为分配和释放的次序刚好完全相反,所以可用到堆栈先进后出的特性。而c++语言的实现一般也会使用到调用堆栈来分配自动变量2,自由存储可以在函数结束后继续生存,所以也需要配合delete来手动析构,释放内存原创 2021-10-31 12:53:05 · 366 阅读 · 0 评论 -
vector的实现原理
vector 是一段连续的线性内存空间。Vector类维护3 个迭代器(三个类型指针)来表示:start,finish,end_of_storage其中,start 指向的是 vector 容器对象的起始字节位置;last 指向当前最后一个元素的末尾字节;end_of_storage指向整个 vector 容器所占用内存空间的末尾字节。start 和 finish 可以用来表示 vector 容器中目前已被使用的内存空间;finish和 end_of_storage 可以用来表示 vector 容原创 2021-11-01 17:54:48 · 806 阅读 · 0 评论 -
C#迭代器
迭代器包含迭代器快的方法或属性。迭代器块本质是包含yield return或yield break语句的代码,只能用于以下返回类型的方法或属性:IEnumerableIEnumerableIEnumeratorIEnumerator根据返回类型,每个迭代器都有一个生成类型(yield type)。如果返回类型是非泛型接口,那么生成类型是object;如果返回类型是泛型接口,那么生成类型是该泛型接口实参的类型,比如IEnumerator的返回类型是string。简单的实例yield return原创 2021-11-26 16:46:49 · 1576 阅读 · 0 评论 -
C#隐式类型
类型术语人们对类型系统的共识可以分为 静态类型,动态类型,显式类型,隐式类型。静态类型和动态类型静态类型是面向编译器的,由编译器检查类型是否合法。动态类型则是在执行期,它决定某个表达式的具体含义(面向对象的多态)显式类型和隐式类型显式类型,会显式地给出所有相关的类型信息,包括局部变量,字段,方法参数或者返回类型。隐式类型,则允许开发者不给出具体的类型,而是通过其他机制根据上下文推断出来。隐式类型局部变量指使用了关键字var声明的变量。他的工作机制只是:省略类型名称,类型信息交由编译原创 2021-11-26 16:43:33 · 302 阅读 · 0 评论