找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2434|回复: 0
收起左侧

VC++基本概念

[复制链接]
ID:105323 发表于 2016-2-12 18:58 | 显示全部楼层 |阅读模式
本帖最后由 51黑黑黑 于 2016-2-12 19:01 编辑

  类是具体对象(实例)的抽象。那么究竟如何抽象?就是把一个实例的特征提取出来,比如,水果是一个类,苹果是水果的一个实例,苹果有苹果的特征,其他水果有其他水果的特征,比如香蕉。我们只要从苹果香蕉中把特征提取出来进行统一管理就可以,这样就形成了水果类classFruits()。然后“Fruites apple”,表示苹果是水果的一个实例。就像人如果是一个类的话,我们每一个人都是这个类的实例。  构造函数最重要的作用是创建对象本身。C++规定,每个类必须有一个构造函数,没有构造函数,就不能创建任何对象。 C++又规定,如果一个类没有提供任何的构造函数,则C++提供一个默认的构造函数(由C++编译器提供),这个默认的构造函数是一个不带参数的构造函数,它只负责创建对象,而不做任何的初始化工作。只要一个类定义了一个构造函数,不管这个构造函数是否是带参数的构造函数,C++就不再提供默认的构造函数。也就是说,如果为一个类定义了一个带参数的构造函数,还想要无参数的构造函数,则必须自己定义。
  当一个对象生命周期结束时,其所占有的内存空间就要被回收,这个工作就由析构函数来完成。 析构函数是“反向”的构造函数,析构函数不允许有返回值,更重要的是析构函数不允许带参数,并且一个类中只能有一个析构函数。析构函数的作用正好与构造函数相反,对象超出其作用范围,对应的内存空间被系统收回或被程序用delete删除时,析构函数被调用。 根据析构函数的这种特点,我们可以在构造函数中初始化对象的某些成员变量,给其分配内存空间(堆内存),在析构函数中释放对象运行期间所申请的资源。
  如图所示,CTextView类中的构造函数是CTextView(),析构函数为~CTextView()。

 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的函数同名,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。
两个重载函数必须在下列一个或两个方面有所区别:
1.、函数有不同参数。
2、函数有不同参数类型,
第一种情况,假设一个对象为cc,那么cc调用两个函数都为cc.output(),编译器无法分辨是哪一种,所以不能构成重载;第二种情况,由于b已经被设为缺省值5,而且另一个参数相同,所以也不能构成重载。

VC++(一)标准输入输出
VC++6.0标准输入输出流库函数iostream常用的输入和输出函数为cin和cout,下面用一个简单的例程来说明

#include <iostream.h>
int main()
{
cout<<"Enter twonumbers:"<<endl;
int v1,v2;
cin>>v1>>v2;
cout<<"The sum of"<<v1<<"+"<<v2<<"="<<v1+v2<<endl;
return 0;
}

cout后面跟左书名号,代表输出
endl表示换行
cin后面跟右书名号,代表输入

VC++(二)MFC AppWizard初步

首先建立一个MFC AppWizard工程,工程名Test如下图所示




                                                     

  建立完成后,会出现如上图所示的视图,在类视图中CMainFrame的名字是不会变的,而APP、Doc、View是以C+工程名+类的方式出现的。可以看到,在上面工程中并未找到入口函数WinMain,其实它的位置在安装目录下VC98\MFC\SRC里面的APPMODUL.CPP中,如下图所示:

  事实上,_tWinMain是个宏,直接右键转到定义出就会发现#define_tWinMain  WinMain这样一个宏定义。我们在_tWinMain函数这里设置一个断点并调试运行,就会发现程序确实在这里停了,说明进入了这个函数。

  接下来一个比较重要的问题是全局对象CTestApp

  CTestApp是从CWinApp派生出来的一个类,而theApp是CTestApp实例化的一个对象,它唯一地表示应用程序本身。CTestApp()导致CWinApp::CWinApp(LPCTSTRlpszAppName)的调用,这个函数主要做程序运行前的初始化工作。


VC++(三)指向指针的指针如下例所示
#include "iostream.h"

int ival=1024;
int *pi=&ival;
int **ppi=π
int a[5]={3,8,7,6,5};
int *pa=a;
const size_t arr_sz=5;

int main()
{
cout<<"ival is"<<ival<<"\n"
<<"&ival is"<<&ival<<"\n"
<<"*pi is"<<*pi<<"\n"
<<"pi is"<<pi<<"\n"
<<"**ppiis"<<**ppi<<"\n"
<<"*ppiis"<<*ppi<<"\n"
<<"ppiis"<<ppi<<"\n"
<<"ais"<<a<<"\n"
       <<"pais"<<pa<<"\n"
<<"*pais"<<*pa<<"\n";
pa=&a[2];
cout<<"pais"<<pa<<"\n"
<<"*pais"<<*pa<<"\n";
pa=a+1;
cout<<"pais"<<pa<<"\n"
<<"*pais"<<*pa<<"\n";

for(int *pbegin=a,*pend=pbegin+arr_sz; pbegin!=pend;++pbegin)
{
cout<<pbegin<<""
  <<*pbegin<<"\n";
}
return 0;



运行结果如下图所示




显然指针变量pi保存的是变量ival的地址,ppi实际上保存的是pi的地址,那么*ppi就是pi的值(即ival的地址),**ppi就是ival的值。

而指向数组的指针pa=a+1后,实际上指向了下一个元素
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表