啰啰嗦嗦学习VC++_<<第二课:掌握C++>>

作者在 2010-03-07 08:35:29 发布以下内容

第二课:掌握C++

C++的特点封装性、继承性、多态性

封装把数据操作数据的函数衔接在一起;不仅使程序结构非常紧凑而且使类内部结构更加安全。继承性增加了软件的可扩充性和代码的重用性。多态性使程序设计人员在设计程序时可以对问题更好的抽象,有利于代码的维护和可重用。

通过程序代码来讲解C++程序基本的特性:

File -> New -> Project(工程) -> Win32 Console Application(控制台应用程序) ->……

File -> New -> Files -> C++ Source File -> File: Point

定义结构体后在右大括号后要加一个分号,结构体和类的定义都需要加分号。

#include <iostream.h>

struct Point

{

       int x;

       int y;

};        //注意这个分号不能省略。

void main()

{

       Point pt;

       pt.x=5;

       pt.y=5;

       cout<<pt.x<<endl<<pt.y<<endl; //cout是标准输出流对象,可以将变量输出到标准输出设备上。与printf类似

}

下边的程序中加入了cin>>

#include <iostream.h>

struct Point

{

       int x;

       int y;

};        //注意这个分号不能省略。

void main()

{

       Point pt;

       pt.x=5;

       pt.y=5;

       cout<<pt.x<<endl<<pt.y<<endl; //cout是标准输出流对象,可以将变量输出到标准输出设备上。与printf类似

       cout<<"please input : pt.x = "<<endl;

       cin>>pt.x;

       cout<<"please input : pt.y = "<<endl;

    cin>>pt.y;

       cout<<pt.x<<endl<<pt.y<<endl; //cout是标准输出流对象,可以将变量输出到标准输出设备上。与printf类似

}

C++的标准输入输出流:

C++提供了一套输入输出流类的对象,它们是cincoutcerr,对应c语言中的三个文件指针stdinstdoutstderr,分别指向终端输入、终端输出和标准出错输出(也从终端输出)

cin>>一起完成输入操作,coutcerr<<一起完成输出与标准错误输出。

利用cincoutC语言中的scanfprintf要方便的多,cincout可以自动判别输出输入数据类型而自动调整输入输出的格式,不必像scanfprintf那样一个个由用户指定。

使用cincout不仅方便,而且减少了出错的可能性。对于输出来说,我们像以上方式调用就可以了,对于输入来说,我们用如下方式调用即可:

int i;

cin>>i;

注意箭头的方向。在输出中我们还使用endl(end of line),表示换行,endl相当于c语言中的’\n’,表示输出一个换行。

C++表针输入输出流头文件

#include <iostream.h>

C语言的是stdio.h

在机构体中定义标准输出函数

#include <iostream.h>

struct Point       //不需要带小括号‘()’

{

       int x;

       int y;

       void output()    //在结构体中定义标准输出函数;c语言中结构体中是不能有函数的但是c++是不一样的,

c++中结构体中是可以包含函数的。因为此,我们就可以将这些操作封装到结构体的内

部当中,使用的时候只需调用结构体的成员函数来完成这些功能。

       {

              cout<<x<<endl<<y<<endl;

       }

};

void main()

{

       Point pt;

       pt.x=5;

       pt.y=5;

       pt.output();     //注意调用函数时候,既然被称为函数那么就有一个括号在后边,不要省略括号。

//     cout<<pt.x<<endl<<pt.y<<endl;

}

输出结果与上边的是一致的。

将结构体struct Point’名改为’class Point’,并在定义的内部加上’public:’结构体换成类

#include <iostream.h>

//struct Point   //注释起来

class Point    // struct Point换成class Point

{

public:       //换成class Point后要增加的属性。

       int x;

       int y;

       void output()

       {

              cout<<x<<endl<<y<<endl;

       }

};

 void main()

{

       Point pt;

       pt.x=5;

       pt.y=5;

       pt.output();

//     cout<<pt.x<<endl<<pt.y<<endl;

}

c++中将结构体和类可以通用。结构体也是一种特殊的类,结构体特殊是因为他是有struct定义的类。Structclass的区别主要在于访问控制上。

class类中如果将public去掉那么程序的运行将会报错说“不能访问私有的成员 cannot access private member declared in class 'Point'

在结构体中默认的是所有的成员都是可访问的,即都是’public’;对于类来说缺省的情况下所有的成员包括成员函数都是私有的,即都是’private’,不能够被外部进行访问。除了这个区别之外在c++中结构体和类是可以通用的。

对于类来说他是通过:public,private,protected来控制内部成员对外的可见性。

public,所有的数据成员在外边都可以被访问。

private, 对外它的数据和数据成员都不能被访问。

protected 这个是在子类和父类之间的访问控制,当然对外也是不能访问的。

如果将struct程序改为

#include <iostream.h>

struct Point

//class Point

{

//public:

private:

       int x;

       int y;

       void output()

       {

              cout<<x<<endl<<y<<endl;

       }

};

void main()

{

       Point pt;

       pt.x=5;

       pt.y=5;

       pt.output();

//     cout<<pt.x<<endl<<pt.y<<endl;

}

这个程序的错误是和class中了public隐去后报错是一致的。

structclass的区别是:在缺省状况下用结构体struct定义的所有内部成员都是可见的都是public的,而用类class定义的所有的内部成员都是私有的,即private的。这个就是结构体和类之间的区别。除此之外结构体和类在C++中是可以通用的。

面向对象的思想考虑问题:

Point pt; Point定义的pt我们就不称之为变量了,而称之为Point这个类声明了一个对象或者叫做实例。什么是类,什么是对象?

类:抽象出一些事物共有的属性。

对象:类的一个对象,具有具体属性值的事物;换句话说就类的一个具体的实例。具有具体属性值。

实例化一个对象:产生一个对象,或者称之为产生一个类的实例。

面向过程的语言和面向对象的语言的转变:

思考一下我开车的方法,车作为一个参数,我们开车进行一系列的过程的操作,这个思路为面向过程。假如我们把汽车看为一个类,汽车启动为汽车这个类中的一个属性,对汽车的一系列操作都作为汽车这个类本身的属性或者说为功能,我们调用汽车也就是调用了汽车的所有的功能,即我们调用一个汽车类也就是实例化一个汽车的对象;这就是面向对象。也就是我们把面向过程转换为面向对象。!

类即把所有的功能、属性都由类抽象包含,我们去调用类实例化的对象,所有的功能都包含在这个实例化的对象中无需我们再去定义操作步骤,这个是面向对象;面向过程也就是仅仅把调用的对象当做一个参数,既然是参数就不包含其相关的属性,我们调用这个参数但是怎么用这个参数,他都具备什么功能等等一些具体的操作过程或者步骤需要我们去自己做,而这些过程这个参数里边是不包括的。

究其原因:面向对象的类中可以包含函数,而面向过程的函数我们用的更多的是结构体,结构体中是不能包含函数的。

再如:听收音机,把收音机作为参数,则是面向过程;当收音机提供开关、调节音量的方法这时就变成面向对象,将收音机变为一个拥有开关、调节音量等归为一个类。

面向对象即为在声明一个类的时候将与之相关的各种操作全部包括在内,只有有了具体的实例之后这些操作才可产生。

下边程序注解:

#include <iostream.h>

class Point

{

public:

       int x;

       int y;

       void output()

       {

              cout<<x<<endl<<y<<endl;

       }

};

void main()

{

       Point pt;

//     pt.x=5;

//     pt.y=5;

       pt.output();

//     cout<<pt.x<<endl<<pt.y<<endl;

}

当我们把赋值注释起来之后执行的结果为:

-858993460

-858993460

Press any key to continue

原因是当我们设定了变量的时候系统会给他分配内存,同时对内存中的数据进行随机的不可预料的赋值,因此当我们输出的时候会将这个随机的数值输出出来。注意:虽然随机赋值但是每次输出的结果都是一样的,均为-858993460

为了防止出现这种不可预料的情况,我们可以在定义类的时候对变量用void init()这个初始化函数进行初始化,同时在调用这个类的时候,先调用这个初始化函数。重新设置后的函数如下:

*void init()

#include <iostream.h>

class Point               //不需要带小括号‘()’

{

public:

       int x;

       int y;

       void init()          //这个也可以写为: void init()

       {                                   {

VC++ | 阅读 1350 次
文章评论,共0条
游客请输入验证码