VC基础

来源:互联网 发布:linux ntp服务器搭建 编辑:程序博客网 时间:2024/06/05 19:42

本人小白,刚学习VC,深知基础薄弱水平低下,还望高手多多指教。特以此纪念之。


1.c、c++、visual c++和visual studio的区别

Visual Studio,我们一般都简称为VS,VC全称是Visual C++,C++就不用解释了吧?Visual Studio其实是微软开发的一套工具集,它由各种各样的工具组成,这就好像Office 2007是由Word 2007、Excel 2007、Access 2007等等组成的一个道理。其中Visual C++就是Visual Studio的一个重要的组成部分。Visual Studio可以用于生成Web应用程序,也可以生成桌面应用程序,在Visual Studio下面,除了VC,还有Visual C#,Visual Basic,过去还有Visual J#,现在还有Visual F#等等组件工具,使用这些工具你可以使用C++语言、C#语言或者Basic语言(微软改进版)进行开发。这就好比桌上放着刀、叉、筷子,你可以用它们来吃饭,无论你用什么工具都可以,因为它们都是餐具的一种。
上文引自http://blog.csdn.net/lxb76486791/article/details/8008339

VC++是Microsoft出品的一个IDE(集成编译环境Integrated Development Environment ,包含编译器、链接器、调试工具、编辑器等),是以C++语言为基础的开发Windows环境程序,面向对象的可视化集成编程系统。

C和C++是跟Basic、C#、Java一个概念的东西,它是一门语言,这个概念就同汉语、英语、法语之间的关系一样。C是面向过程的,数据与算法分开。它的重点在于算法和数据结构。侧重于计算机底层操作。C++是面向对象的,主要特点是类,封装和继承。与C的区别主要为 :类、继承和多重继承、运算符重载、类模板、C++标准库、模板库。


2.WINDOWS资源包括哪些?Visual C++IDE提供了哪些资源编辑器?请叙述下列资源管理器。

windows资源用於创建应用程序的用户界面,包括菜单、工具栏、对话框、图标、光标、位图、快捷键、和串表等。在windows环境下,资源作为一种数据,与程序代码是分离的,可以单独编译。而资源编辑器是对资源进行管理的工具,一般包括图像、工具栏、快捷键、串表和版本信息等资源编辑器。

(注:计算机上系统资源多了去了,“系统资源管理器”是Windows 系统提供的资源管理工具,我们可以用它查看本台电脑的所有资源,特别是它提供的树形的文件系统结构,使我们能更清楚、更直观地认识电脑的文件和文件夹,这是“我的电脑”所没有的。在实际的使用功能上“资源管理器”和“我的电脑”没有什么不一样的,两者都是用来管理系统资源的,也可以说都是用来管理文件的。另外,在“资源管理器”中还可以对文件进行各种操作,如:打开、复制、移动等。)


3.什么是MSDN?试使用MSDN查阅下面的cout,解释并修改下面程序。

MSDN是VC除了具体操作所提供的帮组联机文件外还提供的microsoft developer network library组件,内容为HTML格式,包含了编程原理、方法和应用实例。一般是HELP|目录或者是移动光标到所选再按F1.

应用:
这里写图片描述
改成这里写图片描述

注:第二个头文件用到

#include <iostream>     /************************************************************并且之前的.c文件要改成.cpp文件(扩展名不同:.c 即 C 语言程序源文件,.cpp 即 C Plus Plus C++ 源文件)否则编译时就会出错:fatal error C1189: #error : "eh.h is only for C++!",这是因为iostream标准库要求用到eh.h文件,而Exception Handling的实现需要c++支持。cout是C++编程语言互换流中的标准输出流,和cin相对,需要iostream支持。输出格式为cout <<n;如果你想隔行输入的话,用cout<<n<<endl;如果你想空格的话为cout<<n1<<" "<<n2;要输出变量话需要提前定义,不是变量的话,要加引号,如cout<<"Hello,World!"<<endl;这些是常用的。*************************************************************/

添注:c程序所包含的标准输入、输出的头文件是stdio.h,输入、输出通常通过调用函数(如scanf、printf)来完成,而c++一般采用输入、输出流对象(在头文件iostream.h中进行了类的声明)代替了c的stdio库。利用>>流提取运算符将数据对象从输入流提取出来,利用<<流插入运算符将数据对象插入到输出流,从而完成数据的输入和输出。

额,具体来说我要等到学完VC再过来看…

栗子1:

#include<iostream.h>int main(){    cout << "请输入3个数字,按回车结束.x,y,z:\n" ;    int a,b,c;    cin >> a>>b>>c;         //从键盘读取数据给变量abc    cout << "和为"<<a+b+c<<'\n';    //体会数据流的思想    return 0;}/***********************************************************在c语言中,变量的声明应该放在函数中的执行语句之前,如在主函数和子函数中。而对于c++变量声明可以把变量声明放在首次使用变量的附近位置,提高程序的可读性。**********************************************************/

4.关于变量的类型。

节选自王敏华等著《c程序设计》清华版

在c或者c++语言中,每个变量或者函数都具有两个类型属性:数据类型和存储类型。数据类型规定了他们的取值范围、占用内存大小,如unsigned、long、int、char,而存储类型规定了他们占用内存空间的方式,如本节所讲的extern、stastic。
一个程序在运行时,用户区分为3块:
1)程序区:用来存放c程序运行代码
2)静态存储区:用来存放静态存储类型的变量,如全局变量,在程序开始时给全局变量分配存储区,程序执行完毕就释放。且在程序执行过程中他们占据固定的存储单元。
3)动态存储区:用来存放动态存储类型的变量,如形参变量、函数体内部定义的局部变量,他们在函数调用开始时才分配动态存储空间,函数运行结束后就释放这些空间。在程序运行时,这种分配和释放是动态的,也就是一个程序两次调用同一函数,分配给局部变量额存储空间地址有可能是不相同的。这跟上面相反。
这种存储空间的额分配跟变量的作用域及生存期有关。

a.auto型(略)
b.extern

节自百度
http://baike.baidu.com/link?url=o7rYYL6QBTKkF_Dh9yA3rFd6L_10E-PrxWavgFL5jSdbhpBsEsv3OGSR1-KY-A_XFMq234dxgvvYKuqI3QmojK

对于变量:外部变量跟全局变量是同一类变量两种不同的提法。全局变量是从他的作用域提出的,而外部变量是从他的存储方式提出的。

extern int a;//声明一个全局变量aint a; //定义一个全局变量aextern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。int a =0;//定义一个全局变量a,并给初值,声明之后你不能直接使用这个变量,变量需要定义之后才能使用。

extern int a,如果别的函数A已经定义,这里只是在B函数声明一下表示引用,如果没有定义,也是可以,表示不但自己使用,也可以被其他函数调用。但同为全局变量,名称不可一样,因为都要对他们分配存储空间。

//A.cppint i;int main(){}//B.cppint i;

这两个文件极为简单,在A.cpp中我们定义了一个全局变量i,在B中我们也定义了一个全局变量i。
我们对A和B分别编译,都可以正常通过编译,但是进行链接的时候,却出现了错误,错误提示如下:

Linking...B.obj:error LNK2005:"inti"(?i@@3HA)already defined in A.objDebug/A.exe:fatal error LNK1169:one or more multiply defined symbols foundError executing link.exe.A.exe-2 error(s),0 warning(s)

这就是说,在编译阶段,各个文件中定义的全局变量相互是不透明的,编译A时觉察不到B中也定义了i,同样,编译B时觉察不到A中也定义了i。
但是到了链接阶段,要将各个文件的内容“合为一体”,因此,如果某些文件中定义的全局变量名相同的话,在这个时候就会出现错误,也就是上面提示的重复定义的错误。
因此,各个文件中定义的全局变量名不能相同

对于函数:如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即这两个函数声明没有明显的区别:
extern int f(); 和int f();
也就是当int f()已经在其他源文件函数A定义时,这里指的是声明,用来现在我们的函数B对int f()的调用。没有定义的话这样写也成,只不过下面你要自己写出来这个int f()区定义。当然,出现了extern不但表示可以引用其他函数,也可以被其他函数引用。

c.static

static int m; //定义静态全局变量int n; //定义全局变量

静态全局变量:静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的,所以静态全局变量不能被其它文件所用,这适用于内部函数如static int func(int a)。
全局变量和静态全局变量的区别
1)全局变量是不显式用static修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。
2)静态全局变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。

静态局部变量:在调用函数之前就已经生成,退出函数后仍然存在,变量将保存现有的值,直到程序终止时才消失,故他的生存期为整个源程序。
但是,只能在定义该变量的函数内部使用,这是他的作用域,退出函数后,尽管该变量还存在,但不能使用。
第一次调用函数若未赋初值,则系统自动赋值为0,否则按初值执行。第二次调用时,系统使用的是上次用后留下的保存的值。依次类之。

在c++中的static待续

d.register(略)

e.const

1)对于变量

#define SIZE 20     //预处理,符号常量。不加;const int num=20;       //c语句,num是只读变量。加;int main(){    char a[SIZE];           //正确    char b[num];             //c中错误,c++中正确    num++;                  // 错误,一旦变量被声明为const型,编译器将禁止任何试图修改该变量的操作。    return 0;}

注:
1)这个问题讨论的是“常量”与“只读变量”的区别。常量,例如5, “abc”,等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的,“常量”不等于“不可变的变量”。但是在C++中,局部数组是可以使用变量作为其长度的。
2)但是在标准C++中,这样定义的是一个常量,这种写法是对的。实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSI C对数组的规定限制了它(实际上用GCC或VS2005编译以上代码,确实没有错误产生,也没有给出警告)。

2)对于指针
摘自http://blog.csdn.net/bizhu12/article/details/6672723

const int *A; 或 int const *A;  //const修饰指向的对象,A可变,A指向的对象不可变int *const A;               //const修饰指针A, A不可变,A指向的对象可变 const int *const A;           //指针A和A指向的对象都不可变

这里写图片描述


5.动态内存分配

含义:指在程序运行过程中,根据程序的实际需要来分配一块大小合适的连续的内存单元。程序可以动态分配一个数组,也可以动态分配其他类型的数据单元。动态分配的内存需要有一个指针变量记录内存的起始地址。

1)对于c:
a.

void *malloc(unsigned int size);    //size指的是分配的内存的大小(以字节为单位)

函数malloc()用于分配若干个字节的内存空间,并返回一个指向该存储区地址的指针;若系统不能提供足够的内存单元,函数将返回空指针(NULL).

#include <stdio.h>int main(){    int n,*pscore;    scanf("%d",&n);    pscore=(int *)malloc(n*sizeof(int));    //分配n个连续的整型单元,首地址赋给pscore    if(pscore=NULL)     //分配内存失败,则给出错误消息并退出    {        printf("insufficient memory available");        exit(0);    }//其他...}

说明:
(int *)指针类型转换符,因为malloc的返回值是空类型的指针,两边应一致。
malloc所带的一个参数是指需要分配的内存单元的字节数,一般写成数量n*sizeof(内存单元类型符)

b.

void *calloc(unsigned int num,unsigned int size);//num表示向系统申请的内存空间的数量,size表示申请的每个内存空间的字节数。//其申请的存储空间相当于一个一维数组,第一个参数是大小,第二个参数是数组元素的类型.

C.

void *realloc(void *p,unsigned int size);

改变原来分配的存储空间的大小,即将指针p所指向的存储空间的大小改为size个字节。适用于更改上两个函数。

p=(char *)realloc(p,6*sizeof(char));

d.

void free(void *block);//block是分配的动态内存的首地址,一般为指向内存首地址的指针变量

说明:动态内存释放,通与上面3个成对儿使用。

栗子

#include <stdio.h>#include <stdlib.h>#include <malloc.h>int main(){    int num,i;    int maxscore,minscore,sumscore;    int *pscore;    float averscore;    printf("input the number of student:");//输入学生人数    scanf("%d",&num);    if(num<=0)        return;    pscore=(int *)malloc(n*sizeof(int));    if(pscore=NULL)     {        printf("insufficient memory available\n");        exit(0);    }    printf("input the scores of student:\n");//输入学生成绩    for(i=0;i<num;i++)        scanf("%d",pscore+i);    maxscore=pscore[0];    minscore=pscore[0];    sumscore=pscore[0];    for(i=1;i<num;i++)    {        if(pscore[i]>maxscore)            maxscore=pscore[i];        if(pscore[i]<minscore)            minscore=pscore[i];        sumscore=sumscore+pscore[i];        }    averscore=(float)sunscore/num;    //printf max.min.aver    free(pscore);}

2)对于c++:

a.new
b.delete
暂略


1.解释下列名词含义.
面向过程程序设计(结构化程序设计):利用C编写函数(子函数)来完成不同功能的过程.
面向对象程序设计(OOP,objected-oriented programming):利用C++来编写包含多种属性和方法的类,从而把一个复杂的问题分解成不同(独立)功能的类(对象),然后去处理一些问题。

2.结构体和类的区别(体会上面两种设计方式的区别)
1).结构体内不允许有函数存在,类内部允许有成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。
2).结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种,且默认为private。
3).结构体是不可以继承的,而类可以继承和被继承。
4).存储方式上讲,结构体是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。而类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存。

栗子

#include<stdio.h>#include<iostream.h>class Time{private:                //私有数据成员,只能被自己的成员函数调用    int year;    int month;    int day;public:    Time(int y,int m,int d);        //构造函数    ~Time();       //析构函数    void SetDate(int y,int m,int d);    //这两个为公共成员函数    void ShowDate();protected:};/**************定义类中的各函数****************/Time::Time(int y,int m,int d){    year=y;    month=m;    day=d;    cout<<"The constructor be called:"<<year<<':'<<month<<':'<<day<<endl;}Time::~Time(){    cout<<"The destructor be called:"<<year<<':'<<month<<':'<<day<<endl;}void Time::SetDate(int y,int m,int d){    year=y;    month=m;    day=d;}void Time::ShowDate(){    cout<<year<<':'<<month<<':'<<day<<endl;}void main(){    Time t1(10,35,55);  //这里定义一个类对象t1,并自动调用构造函数,且在退出主函数时自动调用析构函数,这两个一般自动成对使用,且先进后出      Time t2(16,53,9);    t1.SetDate(8,5,16);//用成员函数可接着对数据成员进行处理}
0 0
原创粉丝点击