第一篇:什么是c++(本站推荐)
什么是c++?
C++
C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,“CPP”。它是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。
C++发展历史简单介绍
C语言之所以要起名为“C”,是因为它是主要参考那个时候的一门叫B的语言,它的设计者认为C语言是B语言的进步,所以就起名为C语言;但是B语言并不是因为之前还有个A语言,而是B语言的作者为了纪念他的妻子,他的妻子名字的第一个字母是B; 当C语言发展到顶峰的时刻,出现了一个版本叫C with Class,那就是C++最早的版本,在C语言中增加class关键字和类,那个时候有很多版本的C都希望在C语言中增加类的概念;后来C标准委员会决定为这个版本的C起个新的名字,那个时候征集了很多种名字,最后采纳了其中一个人的意见,以C语言中的++运算符来体现它是C语言的进步,故而叫C++,成立了C++标准委员会。
美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)博士在20世纪80年代初期发明并实现了C++(最初这种语言被称作“C with Classes”)。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、命名空间(name space)逐渐被加入标准。1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC 1488-1998。C++是具有国际标准的编程语言,通常称作ANSI/ISO C++。1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准,下一次标准更新原定是在2009年,目前我们一般称该标准C++0x,但是由于对于新特性的争端激烈,除了在Technical Report 1(tr1)中的新增修改被基本确定外,完整的标准还遥遥无期。况且遗憾的是,由于C++语言过于复杂,以及经历了长年的演变,直到现在(2010年)都没有有一个编译器完全符合这个标准。
目前最符合和接近C++标准的编译器有为 GNU GCC 4.5.0 和 Visual Studio 2010 等。
另外,就目前学习C++而言,可以认为他是一门独立的语言;他并不依赖C语言,我们可以完全不学C语言,而直接学习C++。根据《C++编程思想》(Thinking in C++)一书所评述的,C++与C的效率往往相差在正负5%之间。所以有人认为在大多数场合C++ 完全可以取代C语言(然而我们在单片机等需要谨慎利用空间、直接操作硬件的地方还是要使用C语言)。
子语言
根据Effective C++第三版第一条款的描述,现在C++由以下四个“子语言”组成:
第二篇:C++是一盏灯
C++是一盏灯
可能有的人不知道C++是什么东西,我先简单的介绍一下。C++是比雅尼·斯特劳斯特鲁在1979年开始设计开发的一种高级程序设计语言。说的简单一点就是一个计算机的编程,我们的网页、游戏、APP等功能都是计算机编程的一种形式。它为什么对我来说那么重要,就像是我苦闷生活的一盏灯,且听我细细道来。
我成绩一下也不太好,老师给我的作业批语最多的是——要认真一点;我回家呢,有时也爱玩游戏,爸妈总是为此和我生气,爱玩游戏的怎么会是好小孩?天天被数落的我,心情真是无比的郁闷,虽然我总是装得很开心,日子总是要过的嘛。幸而,在这郁闷的日子里,有一点光亮,就是我很喜欢在游戏中发现bug。有的时候我在玩游戏的时候会对游戏设计师的某个设定很反感,当知道这些游戏都是一个个程序员做出来的,我就很希望我也可以当个程序员,设计出最好玩的游戏。当程序员就必须得学编程——C++。
以前我在网上看免费的编程教学,有点看不懂;而那些从能让入门开始的都是收费培训班。我当然是没有钱的,本来想着我再也不可能成为程序员了,连代码都不可能碰一下了。但是在大约两个月前,学校的校本课程中出现了C++,于是我果断地报了名,而且还成功的入选。上第一节校本课时,我的内心是无比的激动,上了一会儿,成功在老师的带领下打出第一串代码——#include
;又过了一会儿,成功在老师的带领下居然做出第一个程序。虽然这个程序没有我想象中的那么高端,只让它说了句“Holle!”但是我的内心却有了无与伦比的成就感。
校本课已经上了差不多两个月了,学的东西也变难了,我开始感觉我是来做Bug的,每次做一个程序总是会出错好几次,一旦出错就要改,当然出现很多Bug的肯定不只有我一个,毕竟我们那一堆人里面没有一个是专业的。我现在当然明白了原来我总嘲讽游戏怎么那么多bug是不对的,因为设计一个完美的程序真是非常非常的难。但也正因为这么难,我越做越感到有意思。
有人认为程序员=秃子,其实是因为那些程序员熬夜改程序才会变成秃子。虽然我有可能会变成秃子,但是我还是喜欢编程——这个动脑子的游戏。现在,校本课程里的C++就是我平凡单调生活中的一盏灯,让我感到初中生活还是有那么点儿意思的。
第三篇:C++实验
上机实验:
1、回文是指正读,反读均相同的字符序列,如“abba”和“abdba”均是回文,但是“good”不是回文,试用STACK类编写该程序。
#include
int top = 1;char *cMyStack =(char *)malloc((iLen/2+1)*sizeof(char));//定位对原始数组的检测索引初始位置 cMyStack[0] = iLen/2;if(1 == iLen%2){ ++cMyStack[0];}
//将原始数组的一半元素入栈 for(top=1;top<=iLen/2;top++){ cMyStack[top] = *(cScr+top-1);} //从栈顶开始依次匹配
while(*(cScr+cMyStack[0])== cMyStack[--top] && cMyStack[0]++ < iLen){} if(0 == top){//是回文数 free(cMyStack);return 1;} else {//不是回文数
free(cMyStack);return 0;} } 运行结果:
2.利用两个栈类S1、S2模拟一个队列时,编写一程序利用栈的运算实现队列的插入、删除以及判断队列空的运算。
#include
template
assert(!mStack2.empty());mStack2.pop();} template
sq.pushBack(1);printQueue(sq);sq.pushBack(2);printQueue(sq);sq.pushBack(3);printQueue(sq);sq.popFront();printQueue(sq);sq.popFront();printQueue(sq);sq.popFront();printQueue(sq);return 0;} 运行结果:
实验2:
声明复数的类Complex,使用友元函数add实现复数的加法。
#include < iostream > using namespace std;
class Complex { private:
double real, image;public :
Complex(){}
Complex(double a,double b)
{
real = a;image = b;}
void setRI(double a, double b){
real = a;image = b;} double getReal(){ return real;}
double getImage(){ return image;} void print(){ if(image>0)
cout<<“复数:”<< real <<“ + ”<< image <<“i”<< endl;if(image<0)
cout<<“复数:”<< real <<“-”<< image <<“i”<< endl;}
friend Complex add(Complex ,Complex);//声明友元函数 };
Complex add(Complex c1, Complex c2)//定义友元函数
{
Complex c3;
c3.real = c1.real + c2.real;//访问Complex类中的私有成员
c3.image = c1.image + c2.image;return c3;}
void main(){
Complex c1(29, 0.634), c2, c3;c2.setRI(85,106.012);c3 = add(c1, c2);
cout<<“复数一:”;c1.print();cout<<“复数二:”;c2.print();cout<<“相加后:”;c3.print();}
结果:
实验三:
7-5 定义一个基类Shape,在此基础上派生出一个Rectangle和Circle,二者都有getArea()函数计算对象的面积。使用Rectangle类创建一个派生类Square.#include
public: Shape(){}
double GetArea()
{
return 0.1;}
};class Rectangle: public Shape {
public:
Rectangle(double w,double h)
{
width=w;height=h;}
double GetArea(){
return width*height;}
private: double width,height;};class Circle:public Shape { private: double r;
public: Circle(double rr){ r=rr;}
double GetArea(){
return PI*r*r;} };
int main(){
Rectangle * rec=new Rectangle(5,6);
Circle * cir=new Circle(5);
cout<<“RecArea:”< cout<<“CirArea:”< return 1; } 运行结果: 7-10.定义一个Object类,有数据成员weight及相应的操作函数,由此派生出Box类,增加数据成员height和width及相应的操作函数,声明一个Box对象,观察构造函数和析构函数的调用顺序。#include object(){ cout<<“构造object对象”< class box:public object { private: int Height,Width;public: box(){ cout<<“构造box对象”< 姓名:XX 学院:XXX 班级:XXX 学号:XXX i++; } while(i<=10);cout<<“sum=”< #include for(i;i<=10,i++) { sum+=i; } cout<<“sum=”< cout<<“不是合法的输入”< 实验 三、函数的应用(2学时) 1、实验目的: 掌握函数的定义和调用方法。练习重载函数使用。练习函数模板的使用 练习使用系统函数。 在main()函数中提示输入两个整数x,y,使用cin语句得到x,y的值,调用pow(x,y)函数计算x的y次幂的结果,再显示出来。程序名:lab3_4.cpp。 编写递归函数int fib(int n),在主程序中输入n的值,调用fib函数计算Fibonacci级数。公式为fib(n)=fib(n-1)+fib(n-2),n>2;fib(1)=fib(2)=1。使用if语句判断函数的出口,在程序中用cout语句输出提示信息。程序名:lab3_5.cpp。 7)调试操作步骤如下: 选择菜单命令Build|Start Debug |Step In,系统进入单步执行状态,程序开始运行,并出现一个DOS窗口,此时光标停在main()函数的入口处。 把光标移到语句answer=fib(n)前,从Debug菜单单击Run To Cursor,在程序运行的DOS窗口中按提示输入数字10,这时回到可视界面中,光标停在第11行,观察一下n的值。 从Debug菜单中单击Step Into,程序进入fib函数,观察一下n的值,把光标移到语句return(fib(n-2)+fib(n-1))前,从Debug菜单单击Run to Cursor,再单击Step Into,程序递归调用fib函数,又进入fib函数,观察n的值。 继续执行程序,参照上述的方法,观察程序的执行顺序,加深对函数调用和递归调用的理解。 再试试Debug菜单栏中的别的菜单项,熟悉Debug的各种方法。 4、实验原理 C++中函数的重载使得同样的函数名下,只要参数类型、数目不同时,即可根据输入的数据进行相应的函数调用,使用起来简单方便。 5、思考与体会 C++中,函数的运用与之前学过的C语言既有相同之处,也有着不同的地方。相同的地方在于格式、用法等框架上的不变。但是C语言中对于同样的函数名是只能够申明一种函数的,倘若有相同的函数名出现系统即会报错,所以用起来有时是极为不便 0 //参数为两个双精度浮点形的函数 int max1(double a,double b){ a=a>b?a:b;return a;} //参数为三个双精度浮点形的函数 int max1(double a,double b,double c){ a=a>b?a:b;a=a>c?a:c;return a;} void main(void){ int a;double b;a=max1(1,2);cout< Lab3_3: #include int main(){ int i,j,k;cout<<“请输入要比较的3个数: ”< 2131415 public: Rank rank;int frequency;float voltage;CPU(Rank r,int f,float v){ //构造函数 cout<<“构造了一个CPU”< rank=r; frequency=f; voltage=v;} void run(){ cout<<“CPU开始运行”< } void stop(){ cout<<“CPU停止运行”< cout<<“RANK=”< cout<<“frequency=”< cout<<“voltage=”< }; int main(){ CPU cpu(p5,500,2000);cpu.run();cpu.show();cpu.stop();return 0;} Lab4_2 #include //析构函数-17 computer(Rank r,int f,float v){ CPU cpu(r,f,v); //定义CPU对象 RAM ram(1); //定义RAM对象 CDROM cdrom(1); //定义CDROM对象 cpu.run(); cpu.show(); cpu.stop();} };int main(){ computer com(p4,300,3000);return 0;} 实验 七、继承与派生(一、二)4学时 1、实验目的: 学习定义和使用类的继承关系,定义派生类。熟悉不同继承方式下对基类成员的访问控制。学习利用虚基类解决二义性问题 2、实验任务 a)定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。b)定义一个基类BaseClass,有整型成员变量Number ,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。c)定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车类有高度(height)等属性,汽车类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。 3、实验步骤 编写程序定义基类Animal,成员变量age定义为私有的。构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示: error C2248:’age’:cannot access private member declared in class ‘Animal’ error C2248:’age’:cannot access private member declared in class ‘Animal’ 把age改为公有成员变量后重新编译就可以了。程序名为:lab7_1.cpp 0 确方便我们编程。 6、部分参考代码 Lab7_1 #include class Animal{ public: int age;}; class dog:public Animal{ public: int SetAge(int n){ age=n; return age;} }; void main(void){ int age;dog d;age=d.SetAge(3);cout<<“age=”< Lab7_2 #include cout<<“这是父类的构造函数”< cout<<“这是父类的析构函数”< //Motorcycle继承bicycle和motorcar类 class motorcycle:public bicycle,public motorcar{ public: motorcycle(int seat,double H,double MS,double W){ SeatNum=seat; height=H; MaxSpeed=MS; Weight=W;} void show(){ cout<<“seatnum=”< cout<<“height=”< cout<<“MaxSpeed=”< cout<<“weight=”< int main(){ motorcycle che(3,30.33,90.84,500);che.show();return 0;} 实验 八、多态性2学时 1、实验目的: 掌握运算符重载的方法 习使用虚函数实现动态多态性。 2、实验任务 a)定义Point类,有坐标x,y两个成员变量;对Point类重载“++”、“--”运算符,实现对坐标值的改变。 定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。观察虚函的作用。 3、实验步骤 编写程序定义Point类,在类中定义整型的私有成员变量x,y,定义成员函数Point& operator++();Point operator++(int);以实现对Point类重载“++”运算符,定义成函数Point& operator –();Point operator 也就是函数的重载。 6、部分参考代码 Lab8_1 #include class Point{ public: Point(double x=0.0,double y=0.0):xray(x),yray(y){} Point operator++(int);Point operator--(int);void show();private: double xray;double yray;}; Point Point::operator++(int){ return Point(xray++,yray++);} Point Point::operator--(int){ return Point(xray--,yray--);} void Point::show(){ cout<<“x坐标为”< int main(){ Point p(4.5,6.5);cout<<“进行运算前的情况:”< show(&v);return 0;} 1、_____重载 ___不是面向对象系统所包含的要素。2、___构造函数_____的功能是对对象进行初始化。 3、在下列关键字中,用以说明类中私有成员的是_private___。 4、C++对C语言作了很多改进,(引进了类和对象的概念)使得C语言发生了质变,即从面向过程变成面向对象。 5、面向对象程序设计将数据与_对数据的操作_放在一起,作为一个相互依存、不可分割的整体来处理。6、已知f1(int)是类A 的公有成员函数,p 是指向成员函数f1()的指针,采用__ p=&A::f1___是正确的。 7、在说明:const char *ptr;中,ptr应该是___指向字符的常量指针_____。判断: 1、空类就是没有名字的类。错 2、面向对象系统的封装性是一种信息隐藏技术,目的在于将对象的使用者与设计者分开,使用者不必知道对象行为实现的细节,只需用设计者提供的协议命令对象去做即可。错 3、引用类型和指针类型作为函数的形式参数时,对调用函数的实际参数的要求是一样的,均是地址。 4、对象数组在创建时要求构造函数不能有任何参数。错1.___静态数据成员_____是一个类的多个对象共享的。 2.下列静态数据成员的特性中,D)_静态数据成员不是所有对象所共有的_是错误的.A)说明静态数据成员时前边要加关键字static来修饰 B)静态数据成员在类体外进行初始化 C)引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算符 3.静态成员的值对每个对象都是一样的,它的值是可以更新的。()4.由于数据隐藏的需要,静态数据成员通常被说明为(保护的) 5.下面对静态数据成员的描述中,正确的是(静态数据成员是类的所有对象共享的数据)1.允许访问类的所有对象的私有成员,公有成员和保护成员的是(友元函数)2.类A是类B的友元,类B是类C的友元,则__D)__是正确的.A)类B是类A的友元B)类C是类A的友元C)类A是类C的友元D)以上都不对 3.一个类的友元函数能够访问该类的___所有成员___4.类模板的模板参数____D)______.A)只可作为数据成员的类型B)只可作为成员函数的返回类型 C)只可作为成员函数的参数类型D)以上三者皆可 5.一个(类模板)允许用户为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数和返回值可以取任意数据类型。 6.类模板的使用实际上是将类模板实例化成一个具体的___类_____。1 关于类和对象的说法不正确的是()C A类是对象的类,对象是类的对象 B系统不为类分配内存空间,而为对象分配内存空间 C如果把人看作动物,那么细菌也是动物 D类可以看作数据类型,对象也可以叫做对象的实体、实例等类是()的集合,分类的依据是()具有相同属性和服务的一组对象抽象 1对象的封装就是(可进可出,但是外界不能干涉内部的处理过程)C 2关于类的继承不正确的是()C A引入类的继承目的就是为了代码重用,提高编程效率B子女有父母的特征是类的继承 C子继父产业是类的继承 D子类可以全部继承父类的属性和服务,也可部分继承父类的属性和服务 下列关于运算符重载的描述中 运算符重载不可以改变语法结构 友元重载运算符obj1〉obj2被C++编译器解释为(operator>(obj1,obj2))。下列运算符中,A)?:运算符在C++中不能重载。 继承具有___传递性_,即当基类本身也是某一个类的派生类时,底层的派生类也会自动继承间接基类的成员。派生类的对象对它的基类成员中___公有继承的公有成员_____是可以访问的。 在多继承中,公有派生和私有派生对于基类成员在派生类中的可访问性与单继承的规则__部分相同,部分不同_。下列对派生类的描述中,__D)_____是错误的。 A)一个派生类可以作另一个派生类的基类B)派生类至少有一个基类 C)派生类的成员除了它自己的成员外,包含了它的基类的成员 D)派生类中继承的基类成员的访问权限到派生类保持不变对基类和派生类的关系描述中,____B)______是错误的。A)派生类是基类的具体化B)派生类是基类的子集 C)派生类是基类定义的延续 D)派生类是基类的组合派生类的构造函数的成员初始化列表中,不能包含__C)基类的子对象初始化____。A)基类的构造函数B)派生类中子对象的初始化 C)基类的子对象初始化D)派生类中一般数据成员的初始化 下列对派生类的描述中,错误的是(D.) A. 派生类的缺省继承方式是PRIVATEB. 派生类至少有一个基类 C. 一个派生类可以作为另一个派生类的基类D. 派生类只继承了基类的公有成员和保密成员下列说法中错误的是(D.) A. 公有继承时基类中的public成员在派生类中是public的B. 公有继承时基类中的private成员在派生类中是不可直接访问的 C. 私有继承时基类中的public成员在派生类中是private的 D. 私有继承时基类中的public成员在派生类中是protected的若派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的私有成员)实现运行时的多态性要使用___虚函数__。 关于函数的描述中,A)派生类的虚函数与基类的虚函数具有不同的参数个数和类型__是正确的。关于动态联编的下列叙述中,__A)__是错误的。 A)动态联编是以虚函数为基础的B)动态联编调用虚函数操作是指向对象的指针或引用 C)动态联编是在运行时确定所调用的函数代码的D)动态联编是在编译时确定操作函数的用于类中虚成员函数说明的关键字() A.virtualB.publicC.protectedD.private编译时的多态性通常使用()获得。 A.继承B.虚函数C.重载函数D.析构函数 若要强制C++对虚函数的调用使用静态联编,则在调用中对该函数使用(指针)C++有(.2)种联编。 虚函数必须是类的(成员函数) 不能说明为虚函数的是(构造函数) 不同的对象可以调用相同名称的函数,并可导致完全不同的行为的现象称为(.多态性)若析构函数是虚函数,则delete对析构函数的调用采用(重载函数) 若派生类中没有对基类的虚函数进行重定义,则它继承基类中的(成员函数)多态调用指(借助于指向对象的基类指针或引用调用一个纯虚函数)动态联编所支持的多态性称为(运行时的多态性)下列描述中,()是抽象类的特性。 A)可以说明虚函数B)可以定义友元函数C)可以进行构造函数重载D)不能说明其对象(纯虚函数)是一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何派生类中的可访问性的规定是相同的。如果一个类至少有一个纯虚函数,那么就称该类为(抽象类)。下面哪个基类中的成员函数表示纯虚函数(virtual void vf()=0) 关于纯虚函数,下列表述正确的是(纯虚函数是给出实现版本(即无函数体定义)的虚函数)下面哪个基类中的成员函数表示纯虚函数() A.virtual void vf(int)B.void vf(int)=0 C.virtual void vf()=0D.virtual void vf(int)|| 关于纯虚函数,下列表述正确的是(纯虚函数是给出实现版本(即无函数体定义)的虚函数)1 下列关于对象的描述不正确的是(A)A对象只能描述有形的东西 B对象具有属性和服务两个主要因素 C现实世界中的一切事物都可以看作对象,但只有在具体的系统中加以论述才有实际的意义 D对象的属性是对象的静态特征,服务是动态特征,并且对象的属性只能由本对象的服务来操作 2 构成对象的两个主要因素是(属性)和(服务),其中(服务)属于动态属性,(属性)属于静态属性,(属性)只能由(服务)来操作。关于多继承二义性的描述中,错误的是C A.一个派生类的基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性B.解决二义性的最常用的方法是对成员名的限度法C.基类和派生类同时出现的同名函数,也存在二义性问题D.一个派生类是从俩个基类派生出来的,而这俩个基类有又以个共同的基类,对该基类成员进行访问时,可能出现二义性。设置虚基类的目的是 消除二义性 虚基类声明 class B virtual public 带有虚基类的多层派生类构造函数的成员初始化列表都要列出虚基类构造函数,这样将对虚基类初始化 二次 子类型描述错误的是 A子类型关系是可逆的A子类型关系是可逆的 B公有派生类的对象可以初始化基类的引用 C只有在公有继承下,派生类是基类的字类型D子类型是可传递的不符合复制兼容规则的是B基类的对象可以赋值给派生类的对象 A派生类的对象可以赋值给基类的对象B基类的对象可以赋值给派生类的对象C派生类的对象可以初始化给基类的对象D 派生类的对象的地址可以赋值给指向基类的指针第四篇:C++实验报告
第五篇:C++题