您的位置:首页 > 编程语言 > C语言/C++

C++的学习心得

2015-09-23 17:55 381 查看
因为我们在大学大多是以项目为基础来学习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++的开发者已经建好的,所以我们要很好地使用它们就要明白它们的建造方式,至少要知道它们的使用语法。

C++语言与C语言的不同之处(准确的说应该是来看看C++开发者已经为我们做好了什么)
注意:以下只是我在编写六维鼠标时遇到的,不全面,其余区别大家可以在以后的学习中自己摸索。
1)c语言后缀.c,c++后缀.cpp。
2)当函数定义放在函数调用之后时,C程序的函数原型即声明有时可省略,而C++的函数声明不能省略,而且还要求函数的所有参数在函数原型的圆括号中声明。一个不带参数的C函数原型必须使用void关键字,而C++函数原型可以使用空参数表。
3)C++中用new和delete运算符取代C的内存分配和释放函数malloc()和free()。
4)const常量类型:用来表示一个“常值变量”与#define的区别:
#define size 20 //不加;只是文本替换此后不再检查,可能产生负作用
Const int size=20; //加;替换时进行严格检查,只有当size是int型时才替换。
C++面向对象的程序设计

概述:面向对象不只是一种程序设计方法,还是一种建立客观事物模型、分析复杂事物的思想方法,他是以人们通常描述现实世界的方法来描述要解决的问题。

结构化程序设计:是一种自顶而下、逐步求精的模块化程序设计方法。
:对象是累的一个实例。类=数据结构+对数据进行操作的函数
面向对象的程序设计的基本特征:抽象、封装、继承和多态。
抽象:对一类对象进行概括,抽出他们共同的性质并加以描述的过程。
封装:将抽象得到的属性数据和行为代码有机的结合,形成一个具有类特征的统一体。
继承:一个新类可以从已有的类派生而来。
多态:不同对象对于同样的施加于其上的作用会有不同的反应。

类的定义与实现:

成员函数的定义形式与一般函数的定义形势基本相同,但如果在类的外部定义成员函数,必须在成员函数名前加上类名和作用域限定符(::)。

一般将类的定义放在头文件(.h)中,类的实现放在源文件(*.cpp)中,二main主函数可以放在另一个源文件中。在源文件中用#include编译预处理指令包含头文件。

对象:对象是类的一个实例,定义并实现了类,就可以利用类来声明对象,其形式与普通变量的声明类似。
例如:以下用类Time声明了对象t1,today和对象的指针pt1:
Time t1,today; //声明对象t1,today
Time *pt1=&t1; //声明指向对象t1的指针pt1
声明对象后,就可以像引用结构变量一样,利用成员运算符“.”或指向运算符“->”引用对象的公有成员,但注意不能引用对象的非公有成员。如:pt1->setTime()或t1.showTime()

构造函数和析构函数:在声明对象时,对象一般需要进行初始化,及对成员变量进行初始化。在定义类时不能对成员变量进行初始化,因为不能确定类中定义的成员变量是属于哪一个对象。

构造函数:是一种特殊的成员函数,特殊性在于:它不需要用户程序调用,就能在创建对象时由系统自动调用。其作用就是在对象被创建时利用初始值去构建对象,使得在声明对象时就能自动地完成对象的初始化。
析构函数:是在对象的生存期即将结束时由系统自动调用的。析构函数的作用与构造函数相反,用来在对象被删除前做一些清理工作和数据保存工作。

构造函数的名称与类名相同,析构函数的名称是在类明前加符号“~”构成(表达取反的意思)。注意,构造函数和析构函数不能有任何返回类型,包括void类型;析构函数不能有参数。下例说明了构造函数和析构函数的定义方法及执行顺序

静态数据成员在储存类型上类似于一般的static静态变量,也具有全局性。
静态数据成员的属性也可以是公有、私有或保护的。对于公有静态数据成员,除了可以像一般数据库成员那样,直接通过对象或在成员函数中访问它们,还可以利用类名加作用域限定符(::)来访问他们。对于私有和保护属性的静态数据库成员,只能在成员函数中访问它们。
由于静态数据成员不具体属于哪一个对象,因此不能构造函数或其他成员函数中对他们进行初始化,他们的初始化必须在类体外进行。
注意:静态成员函数只能访问类的静态成员(成员变量和成员函数),而不能访问非静态函数。解决这个问题的方法是将对象作为静态成员函数的参数,然后在静态成员函数中通过对象访问非静态成员。

this指针:在成员函数中访问数据成员或调用其他成员函数不需要指定对象,因为他们都是通过一个隐藏的this指针确定当前的对象。
例如:void Time:: showTime()
{cout<<hour’:’<<minute<<’:’<<second<<endl;}
而实际上编译器会把this指针作为成员函数的参数,即上述函数定义等同于:
void Time :: showTime(Time* this)
{ cout<<this->hour’:’<<this->minute<<’:’<< this->second<<endl;}
在一个成员函数中经常需要调用其他函数(非本类的成员函数),而有时需要把当前对象(即对象的地址)作为参数传递给被调用函数,这是必须使用this指针。
区别于非静态成员函数,静态成员函数没有this指针,因为静态成员函数属于整个类,它只有一个运动实例,不需要通过对象,通过类就可以调用它。

友元
定义:友元的另一种类型是友元类,一个类可以声明另一个类为其友元类,友元类的所有成员函数都可以访问声明其为友元类的所有成员。
构成:一个函数要成为一个类的有元函数,需要在类的定义中声明该函数,并在函数声明的前面加上关键字friend。
作用:友元提供了不同类或不同类的成员函数之间以及成员函数和一般函数之间的数据共享机制。
注意:友元关系是单方向的,不具有交换性和传递性。

常对象和常对象成员:对于急需要共享又需要安全的数据,可以利用const来进行保护。
常对象:常对象的数据成员的值在对象的整个生存期内不能被改变,必须利用构造函数进行初始化,且以后不能再被更新。声明格式有以下两种:
const<类名><对象名>(初始值类表) <类名> const <对象名>(初始值类表)
例如:const Timemeeting(8,30,00);

常成员函数:可以使用const关键字限制成员函数对数据成员进行修改操作,这种使用const关键字进行声明的成员函数称为常成员函数。格式如下:
<函数类型> <函数名> (<参数表>) const;
例如,下面声明的成员函数MemberFun()就不能修改对象的数据成员。
void MemberFun() const;
在常成员函数中只能调用常成员函数,而调用其他普通函数可能会造成简介修改数据成员。
常数据成员:可以使用const关键字将数据成员声明为常数据成员。常数据成员的初始值只能通过构造函数获取,并且只能在构造函数的初始化列表中设置其初始值。静态常数据成员初始化只能在类体外进行。

11.继承与派生:C++中,可以在已有类的基础上定义一个新类,新类称为原有类的派生类或子类,而原有类称为新定义类的基类或父类。

语法如下:

class<派生类名> : [<派生方式>]
<基类名>{…
//派生类新增加的成员声明列表};

例如:

class Car : public Vehicle{…
//在派生类Car中新增加的成员};

基类中原有成员的访问权限在派生类中可以被修改,它们的访问权限由派生类定义中的<派生方式>决定。但注意,为了不破坏基类的封装性,无论采用哪种派生方式,基类的私有成员在派生类中都是不可见的,即不允许在派生类的成员函数中访问基类的私有成员。

public:punlic(公有派生)是类继承中最常见派生方式。这样就可以在派生类的成员函数中访问基类中原有的非私有成员,并能通过派生类的对象直接访问基类中原有的公有成员。

private:采用private(私有派生),只允许在派生类的成员函数中访问基类的非私有成员,不能通过派生类的对象直接访问基类的任何成员。

protected:采用protected(保护派生),基类中所有的公有和保护成员在派生类中都成为保护成员。

总结:派生方式就是把基类的非私有成员在派生类中以什么类型存在。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: