游戏开发之C++对C的扩展(C++)

1.C++的输入和输出

  头文件为iostream,扩展为in out stream,即输入输出流。

//std::cout<<输出内容;
std::endl;//结束标记,通知操作系统立刻输出并换行。
std::cout<<"hello world"<<std::endl;

2.命名空间

2.1 域作用符

主要有以下两点作用

  1. 配合命名空间一起使用
  2. 用户访问相同变量名的全局变量时,可以屏蔽当前作用域的变量名
  3. 可优先识别命名空间外部的函数(需要取消命名空间,让命名空间内部函数名相同的暴露)
//取消命名空间
using namespace A;
namespace A
{void Print(){std::cout << " 命名空间内部print " << std::endl;}
}void Print()
{std::cout << " 自定义print " << std::endl;
}int a = 20;
int main()
{int a =100;std::cout<< a << std::endl;std::cout << ::a << std::endl; // 访问全局变量a// 优先识别命名空间外部的函数::Print();// 如果需要调用命名空间里面的函数,则需要指定域A::Print();return 0;
}

2.2 C++名字空间

  在c++中,名称(name)可以是符号常量名、变量名、函数名、结构体变量名、枚举类型名、类名和对象名称等等。为了避免名称的冲突(标识符)C++引入命名空间(namespace)。命名空间是为了避免变量名冲突的解决方案。

2.3 命名空间的使用

  1. 声明

namespace [空间名称]
{
定义变量
函数
数据类型
结构体

。。。。。。【代码段】
}
//namespace属于关键字。

  1. 访问

空间名称::成员变量名;
空间名称::成员名称;

namespace [空间名称]{代码段
}
namespace A
{int a =10;
}
namespace B
{int a = 20;
}
int main()
{std::cout << A::a << std::endl;std::cout << B::a << std::endl;return 0;
}

2.3.1 命名空间不能嵌套在函数内部

错误写法:

int main()
{namespace A{int a =10;}namespace B{int a = 20;}std::cout << A::a << std::endl;std::cout << B::a << std::endl;return 0;
}

2.3.2 命名空间可以相互嵌套

// 用户A
namespace A
{int a = 10;namespace C{int a;}
}// 用户B
namespace B
{int a = 10;namespace C{int a;}
}

2.3.3 命名空间可以随时添加扩展

  可以随时把新成员添加进入,不是一定义好便不可更改。

// 用户B
namespace B
{int a = 10;namespace C{int a;}
}//对上面的namespace B进行扩展
namespace B
{namespace D{int a;}void Print(){std::cout << "namespace B" << std::endl;}}

2.3.4 命名空间可以分离声明和定义

// 命名空间中的函数 定义和声明可以分离
namespace A
{void Print();
}// 分离定义
// 数据类型 空间名称::函数名(参数列表){}
void A::Print()
{std::cout << "namespace A" << std::endl;
}

2.3.5 匿名命名空间

  作用跟static类似,只能在本文件中生效。

namespace
{void Print(){std::cout << "  " << std::endl;}
}namespace
{void Print1(){std::cout << " 匿名命名空间1 " << std::endl;}
}

2.4 命名空间的取消

TIPS:一定不要随意取消命名空间,因为取消意味着暴露。例如自己定义了一个函数名,一个命名空间暴露了一个函数名与自己定义的相同可能造成不必要的bug。

2.4.1 暴露命名空间的某个变量

using 域名称::描述符;// 声明域中的某一个变量暴露出来
即using 空间名称::变量名或函数名或结构体名称等等;

// 要求直接访问A中的变量a
using A::a;

2.4.2 暴露整个命名空间

using namespace 域名称;// 声明一个命名空间暴露整个空间

//暴露整个A命名空间的所有代码段
using namespace A;

3.严格的类型转换(C++类型转换的增强)

typedef enum
{red, blue
}COLOR;int main(int argc, char** argv)
{COLOR color = red;color = 1; // 错误int* p = malloc(10); // 错误char* str = "张三"; //错误return 0;
}
// 以上代码在C中是可以运行的在C++中是不可以的,必须要强制类型转换

3.1 数据类型转换的增强

C++中类型转换需要显示声明,比如 void 转 int 需要显示调用(int*)
volatile关键字解析,保持内存可见性(CPU每次处理这个被volatile修饰的变量的时候,都会从内存中重新加载变量的值到寄存器)

  1. static_cast
    用于非多态类型转换(静态转换),任何标准转换都可以使用它,但是不能用于两个完全不相关的类型转换。static_cast转换的时候会进行安全检测,检测两个类型是否为相关类型。
 int i = 10;double b = static_cast<double>(i);const char* str = "张三";int a = static_cast<int>(str); //报错
  1. reinterpret_cast
    将一种类型转换为另一种不同的类型,就是C中的强制类型转换
 int i = 20;int* b = reinterpret_cast<int*>(i);std::cout << i << " " << b << std::endl;
  1. const_cast
    删除变量const的属性,方便赋值。
 const int i = 3;int* p = const_cast<int*>(&i);*p = 3;std::cout << p << " " << i << std::endl;
  1. dynamic_cast
    用于将一个父类对象的指针转换为子类对象的指针或引用。(动态交换)必需包含一个多态类型(虚函数)。
class A { int a; virtual void func() {} };
class B : public A { int b; };
class C :public A { int c; };int main()
{B b;A* a = dynamic_cast<B*>(&b);if (nullptr == a)printf("error\n");elseprintf("success\n");C* c = dynamic_cast<C*>(a);if (nullptr == c)printf("error\n");elseprintf("success\n");return 0;
}

4.结构体的增强

  1. 在C++中,使用结构体不需要添加struct关键字
 struct tempA{int tempa;};int main(){tempA num;return 0;}
  1. 在C++中,结构体可以有成员变量和成员函数
// 兼容C程序
typedef struct tagA
{int a; // 成员变量// 成员函数(成员函数可以直接访问成员变量)void Print(){std::cout << "Hello " << a << std::endl;}
}TA, * PTA;
  1. 在C++中,结构体可以进行继承
struct A
{int a;void SetA(int a_){a = a_;}
};struct B : A
{int b;void SetB(int b_){b = b_;}
};int main()
{A a;a.SetA(100);printf("%d\n", a.a);B b;b.SetA(300);b.SetB(200);printf("%d %d\n", b.a, b.b);return 0;
}

5.const的增强

  • 在C中const是一个只读的变量,而在C++中是一个常量,可以当作数组长度使用。
  • C++中const声明的变量没有占用内存,而在C中const需要申请内存。
  • 在C++中尽可能使用const代替宏。

在C++中,常量在编译期间会进行类似于宏替换的操作。
如果对一个常量取地址(或之后对其进行改写),会生成一个临时的内存空间,这个内存空间不会指向该常量。

int main()
{const int *p;//指向一个不可修改的int类型int *const p = (int*)malloc(10);// 表示指针指向的地址不能修改const int N = 200;int nums[N];//合法int* p = (int*)&N;*p = 500;printf("%d\n", N); // 200return 0;
}

游戏开发之C++对C的扩展(C++基础)相关推荐

  1. 开发中的“软”与“硬”:高画质移动游戏开发之道

    摘要:游戏的效果不仅与游戏引擎的渲染相关,与硬件优化也有千丝万缕的联系.一款基于芯片优化的移动游戏界面,甚至可以堪比视频游戏的视觉效果.高通半导体事业部资深经理刘晓光从软硬件两个层面分享了移动游戏开发 ...

  2. [整理]Unity3D游戏开发之Lua

    原文1:[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我地博客地址是blog.csdn.net/qinyuanpei.如果 ...

  3. DirectX游戏开发之3D角色动起(下)

    DirectX游戏开发之3D角色动起(下) 直接先上图吧! 动作idle 动作attack 动作walk 动作run 看,多动作的模型搞下来了.原则上只要在此基础上略做修改就可以实现3d游戏的基本制作 ...

  4. 游戏开发之U3D实现技能图标冷却的效果

    游戏开发之U3D实现技能图标冷却的效果 --本次使用的NGUI插件.     制作思路:NGUI插件里面有个UISprite组件,在它上面有个属性叫Type,改变相应的Type类型有不同的作用,本次使 ...

  5. DirectX游戏开发之2D文字的实现

    DirectX游戏开发之2D文字的实现 文字是承载信息最有效的载体之一,各种游戏程序都离不开文字的显示.对于3D文字来说,2D文字有其渲染的高效性和实现的简洁性. 2D文字的显示无论在写2D游戏还是在 ...

  6. 游戏开发之U3D插件EasyTouch5.x使用

               游戏开发之U3D插件EasyTouch5.x使用 本篇只讲EasyTouch5.x的使用,不讲源码.本来想把EasyTouch5.x的使用手册翻译一遍,想来也是没那个时间. 第一 ...

  7. 微信小游戏开发之CocosCreator多分辨率场景适配方案

    主题 Cocos Creator不同手机分辨率的背景图像和场景内容适配 特别说明 CocosCreator微信小游戏开发系列文章,是我在逐步开发过程中,基于官方文档之上,记录一些重点内容,以及对官方文 ...

  8. libGDX游戏开发之Box2D(十四)

    libGDX游戏开发之Box2D(十四) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和goo ...

  9. JAVA游戏开发之FPS精准控制

    目录 JAVA游戏开发之FPS精准控制... 1 1       概述... 2 1.1        编写目的... 3 2       FPS精准控制... 3 2.1        FPS描述. ...

  10. 用C++实现跨平台游戏开发之Allegro引擎

    要:本文重点讨论开源游戏开发库Allegro(Allegro低级游戏例程),同时涉及到一些深度技术并提供了一个简单的示例程序,帮你进一步确定它是否是适合你的开发平台. 一. 一个适于多环境的引擎 Al ...

最新文章

  1. Oracle数据库查看表空间是否为自增的
  2. Intel Realsense D435报错 RuntimeError: MFCreateDeviceSource(_device_attrs, _source) returned: HResult
  3. 鼎捷软件怎么样_凯里物流仓储怎么样
  4. 三、依赖注入是什么?
  5. Spring配置文件中的细节
  6. .net 下语音合成
  7. 中小企业利用VRRP实现链路负载均衡
  8. jQuery 打气球小游戏 点击气球爆炸效果
  9. python numpy库安装winerror5_详解idea从git上拉取maven项目详细步骤
  10. java jar 配置文件路径_java jar 配置文件的相对路径问题
  11. 洛谷 P1115 最大子段和
  12. java定向输出程序日志(输出到txt文件中)
  13. rraylist参数_R语言︱list用法、批量读取、写出数据时的用法
  14. 工厂方法模式java实例,设计模式之工厂方法模式实例(Java)
  15. java基础练习题(含答案)
  16. 实现sqrt()平方根函数
  17. python职位要求_python 开发工程师职位描述与岗位职责任职要求
  18. 360链接云服务器失败怎么回事,360智能摄像机连接失败原因 360智能摄像机连接失败解决办法...
  19. Java中的日期与时间
  20. 运维自我提升:怎样做好企业 IT 运维工作

热门文章

  1. 经验分享 | 我是如何从小白到收获几个不错的offer!
  2. 【珍藏版】 200个机器学习 NLP Python 免费相关教程
  3. 不会真有人觉得聊天机器人难吧——开篇
  4. 《统计学习方法》——支持向量机
  5. 数据库访问优化法则详解之利用更多的资源
  6. 牢记将iPhone特色硬件优势发挥到极致
  7. 平衡——职场小说《监控》推荐
  8. 《沉浸式线性代数》完整版正式发布,全交互式体验
  9. microsoft ppt制作小技巧
  10. 注塑机摆放间距多少合适_请查阅:过滤毛刷摆放参考标准!