c++语言_c++语言基础 - CSDN
c++语言 订阅
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。 [1]  C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。 [2] 展开全文
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。 [1]  C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。 [2]
信息
外文名
The C++ Programming Language/c plus plus
类    别
计算机程序设计语言
基本内容
类、封装、重载、继承、模版
中文名
C++语言
创始公司
贝尔实验室
创始人
Bjarne Stroustrup
C++发展历程
世界上第一种计算机高级语言是诞生于1954年的FORTRAN语言。之后出现了多种计算机高级语言。1970年,AT&T的Bell实验室的D.Ritchie和K.Thompson共同发明了C语言。研制C语言的初衷是用它编写UNIX系统程序,因此,它实际上是UNIX的“副产品”。它充分结合了汇编语言和高级语言的优点,高效而灵活,又容易移植。1971年,瑞士联邦技术学院N.Wirth教授发明了Pascal语言。Pascal语言语法严谨,层次分明,程序易写,具有很强的可读性,是第一个结构化的编程语言。20世纪70年代中期,Bjarne Stroustrup在剑桥大学计算机中心工作。他使用过Simula和ALGOL,接触过C。他对Simula的类体系感受颇深,对ALGOL的结构也很有研究,深知运行效率的意义。既要编程简单、正确可靠,又要运行高效、可移植,是Bjarne Stroustrup的初衷。以C为背景,以Simula思想为基础,正好符合他的设想。1979年,Bjame Sgoustrup到了Bell实验室,开始从事将C改良为带类的C(C with classes)的工作。1983年该语言被正式命名为C++。自从C++被发明以来,它经历了3次主要的修订,每一次修订都为C++增加了新的特征并作了一些修改。第一次修订是在1985年,第二次修订是在1990年,而第三次修订发生在c++的标准化过程中。在20世纪90年代早期,人们开始为C++建立一个标准,并成立了一个ANSI和ISO(Intemational Standards Organization)国际标准化组织的联合标准化委员会。该委员会在1994年1月25曰提出了第一个标准化草案。在这个草案中,委员会在保持Stroustrup最初定义的所有特征的同时,还增加了一些新的特征。在完成C++标准化的第一个草案后不久,发生了一件事情使得C++标准被极大地扩展了:Alexander stepanov创建了标准模板库(Standard Template Library,STL)。STL不仅功能强大,同时非常优雅,然而,它也是非常庞大的。在通过了第一个草案之后,委员会投票并通过了将STL包含到C++标准中的提议。STL对C++的扩展超出了C++的最初定义范围。虽然在标准中增加STL是个很重要的决定,但也因此延缓了C++标准化的进程。委员会于1997年11月14日通过了该标准的最终草案,1998年,C++的ANSI/IS0标准被投入使用。通常,这个版本的C++被认为是标准C++。所有的主流C++编译器都支持这个版本的C++,包括微软的Visual C++和Borland公司的C++Builder。 [3-6] 
收起全文
精华内容
参与话题
  • C++语言基础到进阶

    千人学习 2020-04-28 10:01:09
    《从c语言入门到c++使用高手》套餐地址链接:https://edu.csdn.net/combo/detail/1046 《从C语言入门到c++网络通讯架构师》套餐地址链接:https://edu.csdn.net/combo/detail/1165  
  • C++语言(一)——C++简介

    千次阅读 2017-03-26 12:40:23
    C++语言(一)——C++简介一、C++简介 C语言作是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言并不合适。为了解决软件危机, 20世纪80年代, ...

    C++语言(一)——C++简介

    一、C++简介

        C语言作结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言并不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming)思想,支持面向对象的程序设计语言应运而生。Smalltalk 就是当时问世的一种面向对象的语言。在实践工作中,由于C语言的广泛使用,在C语言的基础上根据面向对象的思想发展了C语言,形成了C with class (带类的C语言)

            1982年,美国AT&T公司贝尔实验室的Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系命名为C++Bjarne Stroustrup博士被尊称为C++语言之父。

    二、C++的应用领域

        C++语言主要用于以下领域:

        A系统层软件开发
        B服务器程序开发
        C流戏,网络,分布式,云计算
        D科学计算

    三、C++语言的内容

        C++语言是在C语言基础上扩展发展而来,完全兼容C语言。在C语言基础上,C++语言主要包括三大部分:C++C语言基础语法的扩展,面向对像(继承,封装,多态)STL等。

    四、C++C语言的增强

            C语言是一个结构化语言,重点在于算法与数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事物控制)。C++首要考虑的是如何构造一个对象模型,让构造的模型能够契合与之对应的问题域,通过获取对象的状态信息得到输出或实现过程(事物)控制所以C语言和C++的最大区别在于解决问题的思想不一样C语言是面向过程的语言,C++是面向对象的语言

            C++C的增强表现在六个方面:

            (1) 类型检查更为严格。

            (2) 增加了面向对象的机制。

            (3) 增加了泛型编程的机制(Template)。

            (4) 增加了异常处理。

            (5) 增加了运算符重载。

            (6) 增加了标准模板库(STL)。


    本文出自 “生命不息,奋斗不止” 博客,转载请与作者联系!

    展开全文
  • 语言C++之简单C++语言介绍

    万次阅读 2018-08-13 13:53:10
    首先让我们先了解一下C++语言  信息学奥林匹克竞赛是一项益智性的竞赛活动,核心是考查选手的智力和使用计算机解题的能力,选手首先应针对竞赛题目的要求构建数学模型,进而构造出计算机可以接受的算法,之后编写...

    这些只是本蒟蒻的一些见解,还望各位神犇积极评论提出宝贵意见,万分感谢!!!!!!!!!!

    第一篇啊,给点关注和赞吧,以后会写更多的!!!!!!!!!!!!!!!!!!!!!!!!!

    首先让我们先了解一下C++语言

         信息学奥林匹克竞赛是一项益智性的竞赛活动,核心是考查选手的智力和使用计算机解题的能力,选手首先应针对竞赛题目的要求构建数学模型,进而构造出计算机可以接受的算法,之后编写出计算机能够执行的程序。程序设计是信息学竞赛的基本功,选手参与竞赛活动的第一步是熟练掌握一门程序设计语言,目前竞赛中允许使用的程序设计语言有C语言、C++语言、Pascal。

       C++由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。开始,C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。

       今天C++已成为世界主流编程语言之一。

    接下来介绍一下编程所需要的工具

     

     

    现附上一道例题

    已知一位小朋友的电影票价是10元,计算x位小朋友的总票价是多少?

    我们先来理清一下题意: 假设总票价用y来表示,那么这道题就是简单的乘法,单价*票数=总票数

    则这个问题可以用以下几个步骤来实现:

      ①输入小朋友的数目x;

      ②用公式y=10*x计算总票价;

      ③输出总票价y的值。

     

    在书写代码之前,我们要先了解一下C++语言的书写方法

    1.先写该程序所需用到的头文件(模板格式:#include<所需头文件>)

    2.using namespace std;(任何语句后面都需要加分号)

    3.函数名称(模板格式:类型名 函数名(){函数内容}

    4.赋值模板格式:类型名 变量名或类型名 变量名=所需赋的值

    5.输入所需输入变量名模板格式:cin>>所需输入变量名

    6.输出模板格式:cout<<所需输入变量名或“所需要直接输出的内容”,后可加换行符endl

    7.恢复原始状态模板格式:return 0)

    代码如下:

    #include<iostream>               //使用cin,cout,须调用iostream库,这是C++基本库,头文件,正文出现的函数都有相应的函数,main函数调用iostream库
    using namespace std;//C++语言必加
    int main(){//main后面跟了一对圆括号( ),表示它是一个函数。C++中所有函数都跟有一对圆括号( ),括号中可以有一些输入参数。注意,圆括号中即使什么都没有也不能省略。如例题中显示,主函数main()中的内容,由一对花括号{ }括起来。 
        int x,y;                                //定义整型变量,如同方程设参
        cout<<"Input x=";               //输入提示,把引号之间的字符
    串送到标准的输出设备(屏幕)上。
        cin>>x;                          //小朋友的人数,输入参数的值
        y=10*x;                       //计算总票价,给y赋值
        cout<<"total="<<y<<endl;  //输出总票价,没有引号则直接输出该变量的值,endl为换行
        return 0;                             //结束程序,可加可不加,但比赛最好加
    }

    另外再讲一下保留小数的语句

    记住小数是浮点型,所以要用double或float

    与这个小数接触到的变量也必须是浮点型的,例如,double s=1.0*w;(其中1.0是浮点型,w也是)

    需要用到头文件<iomanip>

    cout<<fixed<<setprecision(需要保留的小数位数)<<所需保留位数的小数;

    接下来给大家推荐几道题

    https://www.luogu.org/problemnew/show/P1001

    https://www.luogu.org/problemnew/show/P1421

    http://oj.jzxx.net/problem.php?id=1009

    http://oj.jzxx.net/problem.php?id=2284

    http://oj.jzxx.net/problem.php?id=1008

    展开全文
  • C++语言实现贪吃蛇游戏

    万次阅读 2019-10-19 09:07:24
    C++语言写游戏再适合不过了,当然不是因为用它写起来简单,(相反那并不简单),但是其性能绝对是其他语言没法比的。所以这里我会用C++实现一个贪吃蛇的游戏。当然我可能有意隐瞒了你,因为我们不仅仅是用C++纯...

    写在前面
    用C++语言写游戏再适合不过了,当然不是因为用它写起来简单,(相反那并不简单),但是其性能绝对是其他语言没法比的。所以这里我会用C++实现一个贪吃蛇的游戏。当然我可能有意隐瞒了你,因为我们不仅仅是用C++纯语言来干这件事,那会很别扭,因为我们需要图像渲染、声音、甚至是碰撞检测(我最喜欢的一个版块)!所以仅仅用语言是不够的。
    (注:在文章最后我会给出两个版本的贪吃蛇源码及涉及到的一些资源)
    写在最前面就是为了说明我们会用其他的一些工具:DirectX(9.0)、Windows的窗口编程,这些真的没那么简单!如果你之前没听说过这些,也不要太过于担心,因为我主要是介绍贪吃蛇实现的核心逻辑,严格的说,你可以当成数据结构的知识来学,因为整条蛇是以链表为基础的!
    另外,我用纯C语言也实现过一个贪吃蛇的玩意(如果你觉得是的话),先看看游戏的运行效果:
    贪吃蛇版本1:
    这里写图片描述
    不要小瞧它!它有音乐,也有碰撞,虽然体验实在是不咋滴,不过他的游戏编写过程和游戏元素的构成还是对之后进一步编写更棒的游戏提供了十足的基础。因为他是用纯语言做的,不需要其他库等等的支持,所以很适合我们学习借鉴!

    至于第二个版本的贪吃蛇就有很大的改变,尽管还有很多地方需要改进和优化,但是他已经超越了第一个版本很多!下面看看游戏运行效果:
    贪吃蛇版本2:
    这里写图片描述
    是不是有摆脱Dos找到新大陆的感觉,他加入了新的计分模块。下面我就第二个版本的核心实现做出解释。
    版本二游戏核心代码实现
    1,蛇身的单个节点实现:

    //蛇身单个节点
    struct SNAKE {
    	bool IsSurvivor;			//当前结点是否存在(被画)
    	int coor_x;					//节点横坐标
    	int coor_y;					//节点纵坐标
    	SNAKE *link;				//指向下一个节点的指针
    	//构造函数
    	SNAKE(int x, int y, bool survivor = true,SNAKE *link = NULL) {
    		//初始化坐标值,赋值方式为tail派生
    		coor_x = x;
    		coor_y = y;
    	}
    };
    

    的确,一个十分明白的结构体,我无需做出任何解释!
    2,蛇的整个类实现(基于链表)

    //蛇精灵类定义——基于单链表实现蛇身
    class SnakeSprite {
    public:
    	SnakeSprite(int x = 300, int y = 200);
    	~SnakeSprite() { delete snakeHead; }
    	bool addTail();								//蛇尾增加长度
    	void drawThisSnake();						//绘制当前蛇身
    	void positionAction();						//完成蛇身移动(更新每个节点的坐标)
    	void turnLeft();							//蛇头的基本转向
    	void turnRight();
    	void turnUp();
    	void turnDown();
    	void recordCurrentDirection(int d = LEFT);	//记录蛇的当前运动方向,借助枚举类
    	int getDirection();
    	bool IsDeath();								//是否碰撞草丛,是蛇死亡返回true,否则返回false
    	void getCurrentPosRect(RECT &rect);
    	void getCurrentCoor(int &x, int &y);
    protected:
    	int len;									//蛇身长度_以块为单位
    	SNAKE *snakeHead;							//蛇头指针
    	SNAKE *tail;								//蛇尾指针
    	SNAKE *beforeTail;							//尾巴节点的前一个节点,方便移动
    	int directions;
    };
    

    似乎也没什么特别之处,但是有几个地方需要注意,我会在下面着重强调。
    3,部分函数实现的解释
    我想强调的就在这里,贪吃蛇整个游戏的确简单,但是真正编写的时候则需要考虑全面,因为游戏的逻辑还是特别强的。
    1》整个蛇动起来的立足点:
    我们必须记住,游戏中的蛇并不是你想象的那样在随着你的控制而‘游动’,他是电脑在以飞快的速率刷新屏幕,而你只是改变了蛇的节点坐标,而人的眼睛是存在视觉暂留的,这样就会给你一种游戏精灵在走动的效果!
    2》怎样用键盘控制蛇?

    //输入控制
    	if (Key_Down(DIK_UP) && !Key_Down(DIK_RIGHT) 
    		&& !Key_Down(DIK_LEFT) && !Key_Down(DIK_DOWN)) {
    		theSnake.turnUp();
    		if (DOWN != theSnake.getDirection()) {
    			theSnake.recordCurrentDirection(UP);
    		}
    	}
    	if (Key_Down(DIK_RIGHT) && !Key_Down(DIK_UP)
    		&& !Key_Down(DIK_LEFT) && !Key_Down(DIK_DOWN)) {
    		theSnake.turnRight();
    		if (LEFT != theSnake.getDirection()) {
    			theSnake.recordCurrentDirection(RIGHT);
    		}
    	}
    	if (Key_Down(DIK_LEFT) && !Key_Down(DIK_UP)
    		&& !Key_Down(DIK_RIGHT) && !Key_Down(DIK_DOWN)) {
    		theSnake.turnLeft();
    		if (RIGHT != theSnake.getDirection()) {
    			theSnake.recordCurrentDirection(LEFT);
    		}
    	}
    	if (Key_Down(DIK_DOWN) && !Key_Down(DIK_UP) 
    		&& !Key_Down(DIK_RIGHT) && !Key_Down(DIK_LEFT)) {
    		theSnake.turnDown();
    		if (UP != theSnake.getDirection()) {
    			theSnake.recordCurrentDirection(DOWN);
    		}
    	}
    
    //蛇类的成员函数
    void SnakeSprite::turnDown() {
    	//向下转头
    	if (directions != UP) {
    		snakeHead->coor_y += 1;
    	}
    }
    
    void SnakeSprite::turnLeft() {
    	//想左转头
    	if (directions != RIGHT) {
    		snakeHead->coor_x -= 1;
    	}
    }
    
    void SnakeSprite::turnRight() {
    	//向右转头
    	if (directions != LEFT) {
    		snakeHead->coor_x += 1;
    	}
    }
    
    void SnakeSprite::turnUp() {
    	if (directions != DOWN) {
    		snakeHead->coor_y -= 1;
    	}
    }
    

    应该是你想象的那样,我每检测到玩家按下相应的方向键,我会调用snake class的转弯的成员函数(这就是用class的好处,多么统一的代码!),然后紧接着判断玩家是否企图直接来个180°的大逆转(这在贪吃蛇游戏中是违背规则的),如果真的是这样我就在函数中不做任何处理,玩家休想达到这种阴谋!但是如果是合法的转弯(也就是90°),我会改变头结点(就是蛇的头部)的坐标变化趋势,就是代码中那样做。这样蛇就任我们控制摆布了。

    3》怎样实现蛇的移动?

    //蛇类的成员函数
    void SnakeSprite::positionAction() {
    	//实现蛇的自动运动,即依次更新每个节点内坐标的值
    	if (UP == directions) {
    		snakeHead->coor_y--;
    	}
    	if (DOWN == directions) {
    		snakeHead->coor_y++;
    	}
    	if (LEFT == directions) {
    		snakeHead->coor_x--;
    	}
    	if (RIGHT == directions) {
    		snakeHead->coor_x++;
    	}
    	SNAKE *current = snakeHead;
    	int LEN = len;
    	for (int i = 1; i < len; i ++) {
    		current = snakeHead;
    		for (int j = 1; j < LEN - 1 && len >= 3; j ++) {
    			//令current循环到指定位置
    			current = current->link;
    		}
    		current->link->coor_x = current->coor_x;
    		current->link->coor_y = current->coor_y;
    		LEN--;
    	}
    }
    
    

    这是一个相当重要的功能,因为只有可以动起来才有游戏的感觉。就是上面这个简单的函数实现了蛇的移动,他在主函数中是循环调用的,所以他的核心功能就是改变蛇头节点的坐标,让蛇头节点可以沿着当前的运动方向一直移动下去。你也许会问,那蛇的身子是怎么跟着蛇头运动的呢?那就是函数中最后的一个双重循环,内层循环会通过一个指针沿着蛇身链表找到蛇的尾巴的前一个节点,然后把此节点内的坐标值给尾巴节点,这样就实现了尾巴‘跟着动’的效果。第二次进入后内层循环会找到蛇尾巴前一个节点的前一个节点,然后把他的坐标给了尾巴的前一个节点,这样倒数第二个节点也跟上了!之后便一直重复上述循环,其实就是在用每个节点的坐标来刷新其后一个节点的坐标,这样不就让每一段蛇身都与蛇头形影不离了吗!如果还是感觉理解上有困难,可以看看下面的模拟图:
    这里写图片描述
    这里应该十分注意赋值的顺序!,我为何要‘多此一举’地用循环先找到倒数第二个节点,而不是直接从头部开始,因为那样会让蛇的坐标提前丢失,导致我们没法把真正有效的坐标值更新到对应的节点中,从而只看到蛇头在移动!不信?你可以在本子上比划比划。
    4》蛇的死亡碰撞事件检测!

    bool SnakeSprite::IsDeath() {
    	//判断是否超出规定范围 67<x<468/87<y<470
    	if (snakeHead->coor_x > 67 && snakeHead->coor_x < 460
    		&& snakeHead->coor_y > 87 && snakeHead->coor_y < 470) {
    		return false;
    	}
    	else {
    		return true;
    	}
    }
    

    嗯,这取决于你在屏幕上蛇的移动场地面积的尺寸,当检测的某个方向的坐标超过了对应方向上的场地长度,那就GAMEOVER吧!

    食物类的实现代码:

    //FOOD CLASS
    class Food {
    protected:
    	int coor_x;				//食物出现的横坐标
    	int coor_y;				//纵坐标
    public:
    	Food(int x = 100, int y = 100);
    	bool drawThisFood(bool &again);				//绘制当前食物
    	bool checkFoodPosition();					//检查当前食物出现的位置是否合法(即不能与蛇体重合)
    	void getRandCoor(int & x, int & y);			//食物的随机坐标生成
    };
    
    //APPLE CLASS
    class Apple : public Food {	//苹果是Food的一种
    private:
    	int color;				//扩展功能,标定当前Apple的颜色
    public:
    	bool beenCollision(RECT snakeRect); //检测apple是否被碰撞到,是返回true否则返回false
    	void getCurrentPosRect(RECT &rect);			//得到当前的位置矩形
    	//bool beenCollision2(int x, int y);
    };
    
    Food::Food(int x, int y) : coor_x(x), coor_y(y)
    {}
    
    void Apple::getCurrentPosRect(RECT &rect) {
    	RECT currentRect = {coor_x, coor_y, coor_x + 19, coor_y + 22};
    	rect = currentRect;
    }
    
    bool Apple::beenCollision(RECT snakeRect) {
    	RECT rect_apple, rect;
    	getCurrentPosRect(rect_apple);
    	if (IntersectRect(&rect, &rect_apple, &snakeRect)) {
    		return true;
    	}
    	else {
    		return false;
    	}
    }
    
    bool Food::drawThisFood(bool &again) {
    	//绘制当前食物到屏幕
    	int posX , posY ;
    	if (again) {
    		getRandCoor(posX, posY);
    		again = false;
    	}
    	
    	RECT rectApple = { 0, 0, 19, 22 };
    	D3DXVECTOR3 position(coor_x, coor_y, 0);
    	D3DCOLOR red = D3DCOLOR_XRGB(255, 255, 255);
    	spriteoj->Draw(apple, &rectApple, NULL, &position, red);
    
    	return true;
    }
    
    void Food::getRandCoor(int & x, int & y) {
    	//指定范围内的随机函数生成器
    	srand((unsigned)time(NULL));		//随机种子,以系统时间作为基数
    	x = foodAllowPosX + (rand() % 350);
    	y = foodAllowPosY + (rand() % 330);
    	coor_x = x;
    	coor_y = y;
    }
    
    bool Food::checkFoodPosition() {
    	//检查食物位置的合法性
    	return true;
    }
    

    这里我用FOOD作为基类,然后用APPLE来继承它,这主要是想在以后扩展这个游戏的时候加入一些新的玩法,让每种不同的食物都有自己各自属性和反应事件。
    5》食物的随机位置产生

    void Food::getRandCoor(int & x, int & y) {
    	//指定范围内的随机函数生成器
    	srand((unsigned)time(NULL));		//随机种子,以系统时间作为基数
    	x = foodAllowPosX + (rand() % 350);
    	y = foodAllowPosY + (rand() % 330);
    	coor_x = x;
    	coor_y = y;
    }
    

    这个成员函数用了随机数生成器来产生指定区间内的坐标,并把这个坐标当做食物出现的坐标。因为屏幕是在无休止刷新的,所以食物的擦除就不劳我们费心了。
    6》其他
    我在这里只是调了一些关键的地方作了阐述。其他还有琐碎的地方都需要一块块完善,但是都相对简单。至于将蛇绘制到屏幕上,这是件麻烦事!我不能展开讲,我的水平也不敢讲,但是这真的会令你沮丧,如果你只是看某些实现逻辑而其他的可以自己搞定,那么上面的解释还是挺有帮助的;如果你是个新手,那就会觉得知道逻辑和流程却无法把他们绘制到屏幕上,似乎是本我狠狠的放了鸽子。
    也许不必那么沮丧!因为我讲了你也未必能懂(哈哈),你有其他途径可以实现自己的贪吃蛇游戏:
    (1)实现纯语言版本的,没错,就是在那个黑黑的Dos框里的,因为他的实现相对简单,关键是他避免了图形渲染和Windows的窗口创建!这真的是一个不错的入门Demo。你还可以在网上找一些关于他的代码来提高自己的开发效率,如果你仍然感觉逻辑上有困难,那么我也会尽快整理出他的写作思路~
    (2)学习一些图形渲染的库和工具(如DirectX),抑或是一些简单的游戏引擎,如果那样的话,你真的会瞧不起我做的这个贪吃蛇。再不就看看我提供的两套源码吧!

    4,不足之处
    上面的代码尽管解决了一些核心的游戏逻辑,但是依然存在不足。计分系统由于食物出现的位置不当而暴增、食物万一出现在蛇身上怎么办?而我在食物位置的合法性检查上只是返回了个字面量true!希望我们一块交流和改进。

    5,资源链接
    说明:你休想直接复制粘贴上面的代码块来放在编译器里运行它,并且天真的等待游戏画面的出现,因为我早说过这些需要相应工具的支持!你甚至不能运行起版本2的EXE程序,因为可能需要DirectX的游戏环境,而恰好你的机器上没有!但是版本1的贪吃蛇是可以运行起来的,源码也是可以编译的(如果你的编译器正常的话!),因为他真的是用纯语言做的,当然性能也会有不足。
    贪吃蛇版本一资源链接:http://pan.baidu.com/s/1c2EUVc8 密码:na6m
    贪吃蛇版本二资源链接:http://pan.baidu.com/s/1hsb7k92 密码:6sbg

    想一起解决编程中遇到的麻烦吗?想一起学习独立游戏开发吗?想找一群志同道合的朋友吗?想找到自己关于计算机真正的兴趣所在吗?那就加入我们吧!(老学长公众号刚刚开通不久,每隔3天会发表一篇有质量的文章,希望大家多支持!)
    公众号:奇妙的coco

    6,版权声明
    游戏中的音乐、图片、图标等资源均来源于网络,仅供学习之用。
    借鉴数目:《游戏编程入门》、《Windows游戏编程大师技巧》

    最后谢谢大家可以看我分享的一些经验,这些都是在项目过程中遇到的麻烦,希望大家可以收获到一些知识,少走点弯路!

    展开全文
  • c++语言的特点

    千次阅读 2019-04-12 15:21:35
    C++语言是在C语言的基础上发展而来,同时它又支持面向对象的程序设计,它主要具有以下特点: 1.继承自C语言的优点:语言简洁、紧凑,使用方便、灵活;拥有丰富的运算符;生成的目标代码质量高,程序执行效率高;可...

    C++语言是在C语言的基础上发展而来,同时它又支持面向对象的程序设计,它主要具有以下特点:

    1.继承自C语言的优点:语言简洁、紧凑,使用方便、灵活;拥有丰富的运算符;生成的目标代码质量高,程序执行效率高;可移植性好等。

    2.对C语言进行的改进:编译器更加严格,引入引用的概念,引入const常量和内联函数,取代宏定义等。

    3 .同时支持面向过程和面向对象的方法:在C++环境下既可以进行面向对象的程序设计,也可以进行面向过程的程序设计。因此它也具有数据封装和隐藏、继承和多态等面向对象的特征。

     

    (1)支持面向对象编程机制,如信息隐藏、封装函数、抽象数据类型、继承、多态、函数重载、运算符重载、乏型编程(模板)

    (2)兼容C语言

    (3)扩充C语言,如内联函数、函数重载、名字空间、更灵活、方便的内存管理(new、delete)、引用。

    (4)团队开发更简单

     

    C++语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,可方便地构造出模拟现实问题的实体和操作;编写出的程序具有结构清晰、易于扩充等优良特性,适合于各种应用软件、系统软件的程序设计。用C++编写的程序可读性好,生成的代码质量高,运行效率仅比汇编语言慢10%~20%。

     

    C++语言具有以下特点:

    C++是C语言的超集。它既保持了C语言的简洁、高效和接近汇编语言等特点,又克服了C语言的缺点,其编译系统能检查更多的语法错误,因此,C++比C语言更安全。

    C++保持了与C语言的兼容。绝大多数C语言程序可以不经修改直接在C++环境中运行,用C语言编写的众多库函数可以用于C++程序中。

    支持面向对象程序设计的特征。C++既支持面向过程的程序设计,又支持面向对象的程序设计。

    C++程序在可重用性、可扩充性、可维护性和可靠性等方面都较C语言得到了提高,使其更适合开发大中型的系统软件和应用程序。

    C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。

    C++设计成直接的和广泛的支援多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。

    C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。

    C++设计成尽可能与C兼容,籍此提供一个从C到C++的平滑过渡。

    C++避免平台限定或没有普遍用途的特性。

    C++不使用会带来额外开销的特性。

    C++设计成无需复杂的程序设计环境。
     

     

    下面是一篇文章中提到的一些   https://blog.csdn.net/feiyagogogo/article/details/79573753 

    (1)拥有虚函数的类会有一个虚表,而且这个虚表存放在类定义模块的数据段中。模块的数据段通常存放定义在该模块的全局数据和静态数据,这样我们可以把虚表看作是模块的全局数据或者静态数据,类的虚表会被这个类的所有对象所共享。类的对象可以有很多,但是他们的虚表指针都指向同一个虚表,从这个意义上说,我们可以把虚表简单理解为类的静态数据成员。值得注意的是,虽然虚表是共享的,但是虚表指针并不是,类的每一个对象有一个属于它自己的虚表指针。虚表中存放的是虚函数的地址。

    (2)表格中的virtual functions地址是如何被建构起来的?在C++中,virtual functions(可经由其class object被调用)可以在编译时期获知。此外,这一组地址是固定不变的,执行期不可能新增或替换之。由于程序执行时,表格的大小和内容都不会改变,所以其建构和存取皆可以由编译器完全掌控,不需要执行期的任何介入。
    (3)虚表指针则是在进入构造函数主体前被初始化的,(这个工作是编译器做的,对程序员来说是透明的),我们可以把构造函数的调用过程细分为两个阶段,即:1.进入到构造函数体之间。在这个阶段如果存在虚函数的话,虚表指针被初始化。如果存在构造函数的初始化列表的话,初始化列表也会被执行。2.进入到构造函数体内。这一阶段是我们通常意义上说的构造函数。
    (4)由于虚函数的调用需要靠虚表指针获取虚函数地址,因此如果将构造函数声明为虚函数,会导致在虚表指针未初始化前即试图使用,从而产生错误。而析构函数则一般要声明为虚函数,在子类构造时,会先执行父类默认构造函数,再执行子类构造函数,而析构则相反,如果析构函数不为虚函数,则在多态(父类指针指向子类对象)析构时,会因无法动态绑定而只调用父类析构函数而不调用子类析构函数。
    (5)C++在公有继承时,子类会继承父类的所有成员变量与方法(包括私有变量与私有成员函数),只是对于父类的私有成员,子类并无访问权限,因此在子类中这部分被隐藏了,这可以用一个空类继承来验证,通过查看sizeof(继承的空类的值)可以判断子类是否继承了父类的私有变量。
    (6)sizeof(非继承的空类) = 1,这是因为实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以空类所占的内存大小是1个字节。而当类非空时,使用sizeof计算将不会将这一个隐藏字节计入结果中。
    (7)对于delete与delete [] 常理中的认识是单个变量使用delete数组则使用delete [],但实际上,对于基本类型(如float,int,double)delete与delete []的效果是一样的:

    1    int *p = new int[10];
    2    delete p;   //is same to delete [] p



    单对于非基本类型,如对象数组,如果仅仅只是delete就可能会产生问题,因为对于对象的delete还需要不同于基本类型的一步——调用析构函数,因此如果只是delete将只会调用数组中第一个元素的析构函数,这样就有可能造成内存泄漏。

    如果在C++类构造造函数中使用了初始化列表的语法,那么初始化的顺序与成员变量声明顺序相同,而与初始化列表的顺序无关,比如下图的初始化顺序为n2,n1而非n1,n2

    class A    
    {    
    private:    
        int n2;    
        int n1; 
    
    public:    
        A() :n1(0), n2(0){}   
    };
    


    C++使用inline来声明内联函数,这是为了在函数调用处能够直接展开函数代码而避免函数语句较少却因参数传递等代价带来的效率损失,但要注意的是,inline的声明只是用户希望这个函数内联,而编译器有权忽略这个请求。比如当函数语句十分长时,这时候函数的参数传递等开销对函数执行本身而言微不足道,如果还是在调用处展开会造成代码体积的膨胀,从而增大指令的存储空间,得不偿失,因此,对于教长的函数,编译器可能会忽略inline的请求,事实上内联函数也不应该用于较多语句的函数。
    如果内联函数的声明在头文件中则头文件中不仅要包含 inline 函数的声明,而且必须包含定义,且在定义时必须加上 inline 。【关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用】
    inline 函数可以定义在源文件中,但多个源文件中的同名 inline 函数的实现必须相同。一般把 inline 函数的定义放在头文件中更加合适。
    定义在Class声明内的成员函数默认是inline函数:
    class A {   public:  void Foo(int x, int y) { ... }   // 自动地成为内联函数   } 
    结构体内存对齐的3大规则: 
    1.对于结构体的各个成员,第一个成员的偏移量是0,排列在后面的成员其当前偏移量必须是当前成员类型的整数倍 
    2.结构体内所有数据成员各自内存对齐后,结构体本身还要进行一次内存对齐,保证整个结构体占用内存大小是结构体内最大数据成员的最小整数倍 
    3.如程序中有#pragma pack(n)预编译指令,则所有成员对齐以n字节为准(即偏移量是n的整数倍),不再考虑当前类型以及最大结构体内类型

    C++传递参数是如果是按值传递,则会产生一个临时的变量副本(如果传递一个有拷贝构造函数的对象则会调用拷贝构造函数来构造这个对象),如果是按引用传递,则直接传递所引用变量的地址。

    C++返回值与传递类似,如果返回的是一个引用,则直接返回所引用变量的本身(可能是通过返回地址实现,不同编译器实现可能不同),如果返回值非引用,则可能会在函数返回的函数处(比如A函数调用B函数,那么B函数返回的函数为A)分配空间创建一个临时变量(同样会调用拷贝构造函数),也可能直接将返回值存入寄存器(比如对于比较简单的基本类型)同样不同编译器实现不同。
    #include<> 和 #include”” 只是最先搜索的路经不一样。#include<> :表示只从从标准库文件目录下搜索,对于标准库文件搜索效率快。#include”” :表示首先从用户工作目录下开始搜索,对于自定义文件搜索比较快,然后搜索整个磁盘(标准库)。
    在类中 new A与new A()都会调用默认构造函数,但不同的是,当没有为类A提供默认构造或析构函数时(即类A的构造与析构函数由编译器生成,此时认为A是POD类型),则new A()会自动对成员变量初始化(比如把int初始化为0),当为类A提供了默认构造函数,即使提供的默认构造函数什么都不做,此时认为类A是non-POD类型,则new A不会对成员变量初始化。
    当一个变量被明确声明为数组时,比如int a[5];则sizeof(a)计算的是数组所有元素所占的字节,上述例子结果为4∗5=204∗5=20 但当数组是用指针来描述的时候,比如int *p = new int[5];则sizeof计算的是指针的字节而非数组所有元素所占的字节,此外,数组的传参一般也是以指针形式描述,一般有int a[],int size;或int *a两种写法,后一种sizeof计算的依然是指针,而前一种,由于并不知道数组a的长度,因此大部分的实现中sizeof还是将a认为是指针并产生一个warning告诉你sizeof(a)将以指针的方式计算。
    当类中含有其他类成员变量(这个成员类有默认构造函数)时,若这个类没有默认构造函数,则编译器自动产生的默认构造函数将会调用这个类成员变量的默认构造函数,如果用户定义了默认构造函数却没有在其中显式调用类成员变量的默认构造函数,则编译器会自动插入调用成员类默认构造函数的代码段,并且是在插入在原默认构造函数体的所有执行语句之前,当有多个类成员变量(均有默认构造函数)时,插入的顺序与声明顺序相同。
     

    展开全文
  • c++语言

    2014-01-24 11:36:59
    C++程序设计语言是由来自AT&T Bell Laboratories的Bjarne Stroustrup(即本文作者)设计和实现的,它兼具Simula语言在组织与设计方面的特性以及适用于系统程序设计的C语言设施。C++最初的版本被称作“带类的C(C ...
  • c 标准和c++标准

    万次阅读 2018-08-29 10:16:49
    C语言之所以命名为C,是因为 C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。...
  • C语言与C++语言相互调用

    万次阅读 热门讨论 2019-12-12 13:40:33
    C语言与C++语言相互调用 1 C++调用C中的函数 1.1 C++调用C中的函数(正确使用) 1、案例源文件组成 ...
  • 几种在线C++语言编程环境

    千次阅读 2019-05-17 14:41:16
    1.在线工具,它支持几乎所有主流编程语言。 https://tool.lu/coderunner/ 2.http://www.dooccn.com/cpp/ 3. Compile and Execute C++11 Online (GNU GCC v7.1.1),使用gcc编译(强烈推荐!) ...
  • C++语言基础视频教程

    万人学习 2019-06-05 11:16:46
    C++语言基础视频培训课程:本课与主讲者在大学开出的程序设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助初学者有效学习。本教程详细介绍C++语言中的封装、数据隐藏、继承、多态的实现等入门...
  • Java语言与C++语言的差异总结

    千次阅读 多人点赞 2014-02-24 19:36:31
    Java的设计者曾说过,设计这门语言的灵感...通过这些对比,我们能够了解到Java语言相对于C++语言有哪些改进,能带给我们哪些进步,这样对于更加深入理解这两种语言是大有裨益的。   下面我总结一下Java语言与C++语言
  • C++语言的三大特性

    万次阅读 2015-03-08 19:22:02
    又重新看了一个多月的书,也算是基本上... C++语言中支持数据封装,类是支持数据封装的工具,对象是数据封装的实现。在封装中,还提供一种对数据访问的控制机制,使得一些数据被隐藏在封装体内,因此具有隐藏性。封装
  • 那C语言和C++语言到底是怎么回事呢?  首先,我们来看下百度百科对语言和C++语言描述,相对而说也还算是比较权威的。 C语言  C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言...
  • C++语言的设计和演化》

    千次阅读 2017-02-14 14:52:50
    作者是C++语言之父 Bjarne Stroustrup,作者还有一本C++学习入门的书籍,也是非常经典的。这本书二十几年没有更新了,但是,你去阅读学习它,并不会感到有任何不妥。“作者综合性地论述了C++的历史和发展,C++中各种...
  • 它不仅吸收了C++语言的优点,而且摒弃了C++中难于理解的多继承和指针的概念。因此,Java语言具有功能强大、使用方便的特点。Java语言作为静态面向对象的编程语言的代表,完美地实现了面向对象的理论,并允许程序员以...
  • C++语言的主要特点和优点

    千次阅读 2019-08-12 15:40:37
    C++语言有哪些主要特点和优点 1、C++语言的特点 C++语言的的主要特点表现在两个方面,一是尽量兼容C,二是支持面向对象的方法 2、C++语言的优点 语言简洁灵活 运算符和数据结构丰富 具有结构化控制语句 ...
  • 小白 C++语言 入门学习指引

    千次阅读 2019-12-08 16:58:17
    C++语言是当今应用最广泛的面向对象程序设计的语言,它包括C的全部特征、属性和优点。C++被认为是一种中级语言,它综合了高级语言和低级语言的特点,吸引了许许多多的编程学习者。 C++是一门运用很广泛的计算机编程...
  • 数据结构与算法分析 C++语言描述第四版.Mark Allen Weiss 可用于自学数据结构与算法,数据结构与算法分析对于C++的学习至关重要,应该努力掌握好! 百度网盘: 链接:...
  • 浅谈学习C语言与学习C++语言的关系

    万次阅读 热门讨论 2010-08-18 00:25:00
    本文写给C或C++语言初学者。论坛中,常有初学者问“学C++语言前是否要先学C?”。我认为这是个伪问题。问题本身的答案并不是提问人真正想要的。回答问题本身很简单:“当然不需要”。因为C++是一门独立的编程语言,...
  • C++语言标识符的构成遵循规则

    千次阅读 2015-12-23 22:54:33
    (1)标识符必须以字母或...(4)C++语言中,标识符是区分大小写的,即标识符中出现的大写和小写字母被看作是不同的字符。 (5)C++没有规定标识符的长度,但各个编译器都有自己的规定 (6)标识符的命名要有意义。
1 2 3 4 5 ... 20
收藏数 711,643
精华内容 284,657
关键字:

c++语言