函数对象名无效

对象名无效  时间:2021-04-25  阅读:()
第3章C/C++语言基础在第1章和第2章中介绍了VisualStudio2010的开发环境和基本应用程序的创建.
在VisualStudio2010中创建了应用程序后,就需要了解C++语言的语法和规则.
只有深入了解语法规则及语法细节,才能开发出正确高效的程序.
本章将详细讲述VisualC++2010的开发语言——C/C++的语言基础.
3.
1对标准C的扩展——C++每种开发语言都有自己规定的结构和语法,只有编写的程序的结构和语法符合规定,相应的编译器才能正确处理.
实质上,C语言的编写就是数据定义和函数调用的组合.
根据数据的特性,C语言支持多种数据类型的定义,而对数据的操作则在函数调用中完成.
程序入口是main()函数,在main()函数中调用其他功能函数.
因此,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语言编写的程序相差在±10%左右.
而且C++语言的一些性能还可以调整程序的运行效率.
C++语言是面向对象的,C语言是面向过程的.
因此,C++语言是用问题空间的概念描述问题的解决方法,而C语言是用解空间的概念描述问题的解决方法.
所以,C++语言编写的程序比C语言编写的程序更容易理解.
容易理解带来的好处就是第3章C/C++语言基础·19·易于维护.
通常维护工作是占用系统开销比较大的部分,因此C++语言编写的程序的维护开销要比C语言编写的程序的维护开销要小.
C++语言扩展了C语言对库的支持.
使用库复用已有的代码可以大大提高开发效率,因此C++语言也对C语言库的支持做了升级,它将库转换为类,当程序引入一个库,便向程序中引入一个新类,使得程序原有代码与引入的库浑然一体,风格一致,从而使得开发人员对库的使用更方便.
C++语言引入了异常处理.
这一点是对C语言的补充,因为C语言基本没有错误处理机制,C程序对错误的处理,全靠开发人员自己实现.
C++语言引入了异常处理,减少了开发人员对错误处理的程序的编写,并且增强了程序的健壮性.
C++语言对复杂程序的支持比C语言要好.
当程序非常复杂时,用于处理的变量和函数会非常多,比较容易发生命名冲突.
因此,C++语言引入了命名空间机制,有了命名空间的限制,使用的变量和函数就可以无限制的增加.
从而可以支持复杂程序的编写.
据不完全统计,当C语言代码超过50000行时,命名冲突就成为问题,从而阻碍程序的开发.
C++语言由两种文件组成,即以.
h为扩展名的头文件和以.
cpp为扩展名的源文件,分别存放各元素的声明和数据、函数及类的定义.
3.
2C++语法元素C++语法元素包括符号、注释、标识符、关键字、标点符号和操作符.
本节同时还讲述了如何进行元素的声明和定义.
3.
2.
1最小的元素——符号C++符号是C++程序中解析器可以识别的最小的元素.
C++解析器可以识别多种符号,包括标识符、关键字、常数、操作符、标点和其他分隔符等.
这些符号组合起来,就成为程序指令.
符号被"空白"分隔开.
空白可以是一个或多个下列元素的组合.
空格:当按下Space键时,输入的就是空格.
水平Tab键:此键根据系统定义,可以连续输入几个空格,一般是4个空格或8个空格.
换行:表示在编辑器中光标另起一行.
回车:当按下Enter键时,输入的就是回车.
注释:是用于描述代码的作用,方便开发人员标记程序的功能.
每个处理单元使用输入流处理,解析器使用从左到右的方向扫描输入流,创建更长的符号并从中分隔符号.
例如代码如下:a=i+++j;//自增一语句的使用示例开发人员可能想实现下面两条语句中的一条:a=i+(++j)第1篇VisualC++开发基础·20·a=(i++)+j//编译器会按照此种方法解析上面的自增语句示例因为解析器分析输入流时,使用从左到右的方向分析,所以,它会采用第二种解释方法.
3.
2.
2注释规范注释是写在程序代码中用于标记代码功能的符号,但是编译器在编译时,会将注释作为空格处理.
虽然编译器在编译时忽略注释内容,但是它对程序开发来说非常重要,也是衡量程序质量的一个重要指标.
注释的主要作用是注释代码,提供编写准确、适当的注释,对程序员和整个开发团队来说都非常重要,为后期维护和代码共享提供方便.
C++支持两种注释方式——单行注释和块注释.
单行注释:以两个反斜杠开头,后面加注释内容.
此注释方式表示//后一直到行尾的内容全部为注释.
块注释:以/*开始,以*/结束,其中的内容全部为注释.
下面代码说明了两种注释的使用:inta=5;//定义整型变量a,初始化为5/*定义整型变量b,初始化为6*/intb=6;从上面的例子可以看出,在注释出现跨行时,最好使用块注释.
当注释比较简短,一行足以显示时,使用单行注释比较简单.
需要注意的是,注释是不支持嵌套的,例如:/*目的:注释整块代码问题:每行后的嵌套注释代码是无效的chara='A';/*初始化字符*/cout指针的成员选择从左向右++自增一后缀无––自减一后缀无new分配对象无delete删除对象无delete[]删除对象无++自增一前缀无––自减一前缀无*乘无&地址符无+加无–减无!
逻辑否无~位与无sizeof对象大小无sizeof()类型大小无typeid()类型名称无(type)类型转换从右向左const_cast类型转换无dynamic_cast类型转换无reinterpret_cast类型转换无static_cast类型转换无*类成员的应用指针从左向右–>*类成员的指针从左向右*乘从左向右/除从左向右%取模从左向右+加从左向右–减从左向右第1篇VisualC++开发基础·24·续表操作符名称方向>右转换从左向右大于从左向右=大于等于从左向右==等于从左向右!
=不等于从左向右&位与从左向右^位异或从左向右|位或从左向右&&逻辑与从左向右||逻辑或从左向右e1e2:e3条件从右向左=赋值从右向左*=乘赋值从右向左/=除赋值从右向左%=模赋值从右向左+=加赋值从右向左–=减赋值从右向左>=右转换赋值从右向左&=位与赋值从右向左|=位或赋值从右向左^=位异或赋值从右向左,逗号从左向右3.
2.
7声明与定义C++使用声明告诉编译器程序中定义了哪些程序元素或对象,而定义则说明了元素所执行的代码或数据.
对象在使用前必须先声明.
一条声明语句可以声明一个或多个对象.
通常程序中需要多次使用声明.
要使用多声明,则多声明中定义的元素类型必须相同.
除了下面的情况,声明也可以作为定义来使用.
声明是一个函数原型,即声明函数,但是没有函数体.
包括extern标识符时,但是对象和变量没有初始化,或者函数没有函数体.
此时表示在当前处理单元中不用进行定义,给定的是外部的连接名称.
在类声明中的静态数据成员.
因为静态类数据成员是被类的所有对象共享的不连续的变量,因此,必须在类声明的外部定义和初始化.
没有定义的类名称的声明,如classT.
使用typedef关键字声明的类型.
第3章C/C++语言基础·25·下面的代码给出了声明也作为定义的用法:inti;//声明和定义整型int变量iintj=10;//声明和定义整型int变量jenumsuits{Spades=1,Clubs,Hearts,Diamonds};//声明枚举类型classCheckBox:publicControl//声明继承自Control的CheckBox类{public:BooleanIsChecked();//判断是否选中的函数声明virtualintChangeState()=0;//选择状态变量的函数声明};下面的代码给出了声明不作为定义的用法:externinti;//声明外部整型变量ichar*strchr(constchar*Str,constcharTarget);//声明strchr()函数定义是对象或变量、函数、类或枚举型的唯一说明.
因为定义必须是唯一的,所以一个给定的程序元素只能包含一个定义.
在声明和定义之间是多对一的关系,同一定义的元素,可以在程序多处声明.
有如下两种情况,程序元素可以被声明但是不用定义.
函数声明了,但是未被其他函数调用或使用此函数地址的表达式.
类仅被使用,但是不需要知道其定义.
这也是需要将声明放在.
h头文件中的原因.
因此类必须声明.
代码如下:classWindowCounter;//声明引用的外部类WindowCounter,此类没有定义classWindow//声明类Window{staticWindowCounterwindowCounter;//不需要WindowCounter定义};3.
3常量和变量在编写程序的过程中,需要使用"一些可以区分的实体"存储开发过程中的值.
这就产生了常量和变量.
C++中使用"一串有意义的字符的组合"(即标识符)标识常量和变量,这样在程序设计中,就可以使用这些常量和变量存取需要的值.
对于常量和变量的定义及使用C++有其语法和规定.
本节就介绍有关常量和变量的使用.
3.
3.
1定义常量常量顾名思义就是固定的量,在有效范围内值是不可以变化的.
在C++中使用const关键字定义常量,表示标识符表示的值是常量,告诉编译器,不允许程序代码修改它的值.
语法如下://定义一个数据类型为datatype,名称为name,取值为value的常量constdatatypename=value;上述语法表示定义一个数据类型为datatype,名称为name,取值为value的常量.
如第1篇VisualC++开发基础·26·下代码定义一个数据类型为整型,常量名为fee并且取值为2的常量:constintfee=2;//定义一个整型的常量fee,值为2在程序中,使用下列代码是错误的:fee=10;//错误:常量值是不可以修改的fee++;//错误:常量值是不可以修改的C++中常量分为整型常数、字符常数、浮点常数和字符串常数4种类型.
1.
整型常数整型常数表示没有小数部分或指数部分的数据常数,代表固定的整数.
整型常数可以是十进制数(有效数字位为0~9)、八进制数(有效数字位为0~7)或十六进制数(有效数字位为0~9,A~F).
其可以是有符号数,也可以是无符号数.
可以是long类型,也可以是short类型的.
可以是以0开头的数字代表八进制数,以0x或0X开头的数字代表十六进制数,以u或U结束的数字表示无符号数,以l或L结束的数字表示长整数,以i64结束的数字表示64位整数.
如下代码显示了整型常量的定义方式.
constinta=347;//十进制常量,值为347constintc=0365;//八进制的365constintd=0x55ff;//十六进制常量constinte=0X55FF;//十六进制常量,与d的值相等constunsigneduVal=256u;//无符号数constlonglVal=0x7FFFFEL;//十六进制形式的长整型constunsignedlongulVal=076342ul;//八进制形式的无符号长整型2.
字符常数C++字符常数是字符集的一个或多个成员,使用单引号引起来.
VC使用ASCII字符集.
字符常数有3种形式——标准字符常数、多字符常数和宽字符常数.
constcharch='y';//标准字符常数constintmbch='xy';//指定依赖于系统的多字符常数constwchar_twcch=L'xy';//指定宽字符常数此处mbch是一个int类型的.
如果将它声明为char,则其中的y将会被忽略.
一个多字符常数可以包含4个字符,指定超过4个字符的字符常数时,会发生错误.
因为一个字符是8位的,而int是32位的,因此,只能代表4个字符.
微软C++支持标准、多字符和宽字符常数.
使用宽字符常数可以指定扩展的可执行字符集的成员.
标准字符常量使用类型char,多字符常数使用类型int,宽字符常数使用类型wchar_t,这3种类型分别在STDDEF.
H、STDLIB.
H和STRING.
H文件中定义,其中宽字符函数在STDLIB.
H文件中定义.
标准字符常数和宽字符常数的定义方式的不同在于,需要在宽字符常数取值前加上字母L.
例如代码如下:constcharschar='a';//标准字符常数constwchar_twchar=L'\x81\x19';//宽字符常数第3章C/C++语言基础·27·从上面的代码中可以看出,在定义wchar宽字符常数时使用\x81的形式,这里用到了转义符反斜线.
在C++中,使用反斜线加上指定码值代表特殊的字符.
如表3-4所示列出了C++中常用的转义字符.
表3-4C++常用转义字符字符ASCII表示方法ASCII值转义序列换行NL(LF)10or0x0a\n水平Tab键HT9\t垂直TabVT11or0x0b\v退格键BS8\b回车CR13or0x0d\r进制符FF12or0x0c\f反斜线\92or0x5c\\问号63or0x3f\单引号'39or0x27\'双引号"34or0x22\"八进制数ooo—\ooo十六进制数hhh—\xhhhNull字符NUL0\0如果在反斜杠后的字符不是合法的换码字符,各种C++处理各不相同,在VC中,会报unrecognizedcharacterescapesequence警告,表示不能识别的转义字符序列.
3.
浮点型常数浮点型常数用于表示包含小数部分的常数,默认类型为double型.
浮点型常数包含小数点,也可以包含指数.
浮点常数中的e或E后面部分的内容为指数部分,表示浮点数的数量级,数值为10的次幂,在常数前面的+或–表示符号,在常数后面的f(或F)、l(或L)分别表示其类型为float或long.
下面是浮点型常数的例子.
constdouble=18.
46//浮点型常数constdouble=38.
//浮点型常数constdouble=18.
46e0//浮点型常数,18.
46的10的0次幂constdouble=18.
46e1//浮点型常数,18.
46的10的1次幂4.
字符串常数字符串常数是包含0个或多个字符集中的字符的字符串,使用双引号引起来.
字符串常数是一个以NULL结束的字符序列.
字符串的连接可以采用多种方式实现,例如代码如下:charszStr[]="12""34";//定义字符数组charszStr[]="1234";//定义字符数组与上一行的作用相同cout)或类对象的指针成员操作符(*或->*)访问.
而非静态类成员数据可以看作类对象的本地作用域.
例如代码如下:classPoint//定义代表点的类{intx;//点的X坐标,具有类作用域,也可以看作类对象的本地作用域inty;//点的Y坐标,具有类作用域,也可以看作类对象的本地作用域};在上面的代码中,Point类的x和y成员的作用域可以看作Point类的类作用域.
(5)原型作用域.
函数原型中声明的变量只在原型声明范围内有效.
以下代码声明了strcpy()函数原型,其中变量szDest和szSource的作用域是在函数原型声明的范围内.
char*strcpy(char*szDest,constchar*szSource);//strcpy()函数原型2.
理解作用域虽然作用域的概念是隐形的,但是对于它理解不透,会在程序中出现错误或隐藏的问题.
下面对作用域的理解做些说明.
(1)变量的声明点为声明后和初始化前的程序点;枚举类型的声明点是定义了标识符,第1篇VisualC++开发基础·30·但是还没有初始化前.
例如代码如下:doubledVar=7.
0;//定义double类型的变量,并初始化为7.
0voidmain(){doubledVar=dVar;//将全局变量的值赋值给本地作用域的变量}在上面代码中,声明点在初始化之前,则本地dVar应该初始化成全局变量dVar的值,即7.
0.
枚举值的处理方式是相同的.
例如代码如下://定义4个值分别为1、2、3、4的常量constintSpades=1,Clubs=2,Hearts=3,Diamonds=4;enumSuits//定义Suits枚举类型{Spades=Spades,//错误Clubs,//错误Hearts,//错误Diamonds//错误};上面代码定义了常量Spades、Clubs、Hearts和Diamonds,这些常量的作用域为全局作用域,因此在枚举值Suits中使用这些常量定义枚举值是错误的.
因此,在编写代码时,即使作用域不相同,也应该尽量避免名称重复.
在C++中,提供了一种隐藏名称的方法.
使用这个方法可以将变量的作用域限制在一定范围内.
例如代码如下:Test()//Test()函数{inti=0;//定义函数作用域的int类型的变量i,并初始化值为0coutinti=7;//定义文件作用域的变量ivoidmain(){inti=5;//定义块作用域的变量icout02#include03#include04#include0506enumNumType//声明一个枚举类型来描述要输出的类型07{08INTEGER_INT,//整型类型09INTEGER_LONG,//长整型类型10INTEGER_DOUBLE//double类型11};12unionNumValue//声明一个包含下面3种类型的共用体13{14intiValue;//int类型值15longlValue;//long类型值16doubledValue;//double类型值17};1819voidmain(intargc,char*argv[])20{21intcount=argc-1;//计算输入的参数个数22NumValue*Values=newNumValue[count];//存放值的共用体23NumType*Types=newNumType[count];//存放类型的数组24for(inti=1;iINT_MAX)||(atol(argv[i])02#include03#include04#include0506structNumForm//表示数值的匿名共用体07{08enumNumType//声明一个枚举类型,用于描述要输出的类型09{10INTEGER_INT,//整型类型11INTEGER_LONG,//长整型类型12INTEGER_DOUBLE//double类型13};14NumTypetype;//值的类型15union//声明一个包含下面3种类型的共用体16{17intiValue;//int类型值18longlValue;//long类型值19doubledValue;//double类型值20};21voidprint();//打印信息的函数22};23voidNumForm::print()//根据数据类型,打印相应的信息24{25switch(type)//判断类型26{27caseINTEGER_INT://如果是整型,则输出整型值28printf("数据类型为Integer,其值为%d\n",iValue);29break;30caseINTEGER_LONG://如果是长整型,则输出长整型值31printf("数据类型为Long,其值为%d\n",lValue);32break;33caseINTEGER_DOUBLE://如果是double型,则输出double值34printf("数据类型为Double,其值为%f\n",dValue);35break;36}37}3839voidmain(intargc,char*argv[])40{41intcount=argc-1;//计算输入的参数个数42NumForm*Values=newNumForm[count];//存放输入的参数信息43for(inti=1;iINT_MAX)||(atol(argv[i])>=右移赋值运算符,将左操作数的二进制位向右移动右操作数个位,并赋值给左操作数&=位与赋值运算符,将左操作数和右操作数的与结果赋值给左操作数|=位或赋值运算符,将左操作数和右操作数的或结果赋值给左操作数^=位异或赋值运算符,将左操作数和右操作数的异或结果赋值给左操作数具体的使用,参看如下代码:voidprintAssignment()//赋值运算符示例{inta=2,b=3,c=6,d=9,e,f=4;//定义整型变量a、b、c、d、//e、fcout>=b)c=">=b,c)>=b,c)结果cout>=b)c=2(b&=d)b=1(c|=d)c=11(b^=c)b=10第3章C/C++语言基础·43·3.
5.
3关系运算符C++提供了一组二进制关系和相等运算符,用于比较两个操作数之间的指定关系是否成立.
如果关系成立,则关系表达式返回1;否则,关系表达式返回0.
关系表达式的返回值类型为int类型.
表3-8中列出了C++支持的关系运算符.
表3-8关系运算符关系运算符功能大于运算符.
判断左操作数是否大于右操作数>=大于等于运算符.
判断左操作数是否大于或等于右操作数==等于运算符.
判断左操作数是否等于右操作数!
=不等于运算符.
判断左操作数是否不等于右操作数下面代码显示了关系运算符的使用:voidprintRelation()//关系运算符示例{inta=1,b=2,c=2,d=4,e=5;//定义整型变量a、b、c、d、ecoute)="e)e)结果cout=d)="=d)=d)结果coute)=0(e>=d)=1(b==c)=1(b!
=c)=0在使用关系运算符时,要注意等于运算符"=="与赋值运算符"="的使用,等于运算符是判断两个操作数是否相等,而赋值运算符是将右操作数的值赋值给左操作数.
示例代码如下:if(a==b)//判断a和b是否相等{}和if(a=b)//将b赋值给变量a,并判断变量a的值是否大于0{}虽然上面两条if语句都没有语法错误,但是含义是完全不同的.
第一条表示判断变量a和变量b的值是否相等,第二条语句表示将变量b的值赋值给变量a.
有时会由于笔误,第1篇VisualC++开发基础·44·将第一条语句写成第二条语句的形式,这样会导致程序的逻辑错误.
3.
5.
4逻辑运算符C++中有3种逻辑运算符,分别是逻辑与、逻辑或和逻辑非.
除了逻辑非是一元运算符外,逻辑与和逻辑或都是二元运算符.
逻辑与运算符符号为"&&",用于运算两个操作数之间的与关系.
当两个操作数都为非0时,则结果值为1;否则,结果值为0.
运算方向为从左向右.
代码如下:voidprintLogicalAnd()//逻辑与运算符的示例{intnCount=5,nPrice=2;//定义数量和单价变量,并分别赋值为5和2if((nCount>0)&&(nPrice>0))//输出货物总价cout120)||(age>右移运算符是二目运算符,结果是将第一个操作数的各位向右移动第二个操作数指定的位数后的值.
在移动过程中,原来右边多出的位数丟掉,左边的位数使用0补齐~二进制反码运算符是一目运算符,也称为补码或位非运算符,得出操作数的补码.
操作数必须是整型类型的,并且运算后的结果值的类型与操作数相同.
当操作数的某位为1时,结果值对应的位为0;当操作数的某位为0时,结果值对应的位为1位运算符的使用,代码如下:voidprintBitOperator()//位运算符示例{inta=3,b=5,result;//00000011、00000101result=a&b;//位与运算符00000001=1cout>3;//右移运算符00000000=0cout>3)=">3)=0(~c)=174763.
5.
6三目运算符C++中只有一个三目运算符,即条件运算符(:).
它是为了简化条件语句的编写而提供的运算符,其语法格式为:逻辑表达式表达式:条件表达式其中,逻辑表达式必须是整型、浮点型或指针类型,其后加上条件运算符,表示运算符会计算逻辑表达式的值是否为true(即非0).
如果是true,则结果值为表达式代表的值;如果是false(即0),则结果值取条件表达式的值.
这两个也称为结果表达式,加上冒号作为分隔符.
无论是表达式还是条件表达式都可以是可计算的表达式,但是这两者不能同时是可计算的表达式.
条件运算符的功能等同于如下if条件表达式:if(逻辑表达式){结果=表达式;}else{结果=条件表达式;}如下代码显示了条件运算符的使用方法:voidprintConditional()//条件运算符{intnBalance=20,nAssign=1,result;//定义变量值result=(nBalance//范围确定符的示例intpages=800;//全局变量voidprintPages(){intpages=100;//本地变量cout),其语法格式为:表达式.
成员选择标识符//第一种方式表达式->成员选择标识符//第二种方式其中,表达式表示类型为结构体、联合体或类等复合对象的变量或指针.
第一种方式中,表达式代表的是对象变量;第二种方式中,表达式代表的是指针.
成员选择标识符表示表达式类型的成员函数名称.
操作的结果值是标识符的返回值.
实际上,如果表达式在前面包含间接访问操作符"*"应用的指针值,使用"->"成员选择符的表达式是使用".
"成员选择符的表达式的简写版本.
因此,当表达式是指针类型时,下面两种成员选择表达式的作用是相同的:表达式->成员选择标识符//指针成员访问符(*表达式).
成员选择标识符//对象成员访问符具体使用代码如下:structMyDate{//成员选择操作符示例intnYear;//年intnMonth;//月intnDay;//日};voidprintMemberSelect()//打印选择的成员函数{MyDatetmpDates;//定义MyDate结构的变量tmpDates.
nYear=2008;//为对象的nYear变量赋值coutnYearnYear表达的含义是完全相同的,区别在于一个是用于赋值,一个是用于取值.
其运行结果如下:年=20083.
5.
13成员指针操作符C++提供成员指针操作符.
和->来访问类的成员指针.
这两个操作符都是二元操作符,组合第一个操作数和第二个操作数访问类成员,其语法格式为:类表达式.
成员表达式//第一种情况类表达式->成员表达式//第二种情况第一种情况:类表达式必须是类类型的对象,成员表达式必须是成员指针类型.
第二种情况:类表达式必须是指向类类型对象的指针,成员表达式必须是成员指针类型.
下面是使用这两种成员操作符的示例,代码如下:第1篇VisualC++开发基础·52·voidprintClassAccess()//成员访问符示例{CMyDatemyDate1;//定义CMyDate类型的变量myDate1.
nDay=17;//为myDate1变量的nDay成员赋值为17CMyDate*myDate2=newCMyDate();//定义CMyDate类型的指针变量myDate2->nDay=18;//为myDate2变量的nDay成员赋值为18//输出变量的值coutnDay="nDay100)//判断Amount变量的值是否大于100{inta=30;//定义整型变量a的值为30coutIsDirty())//判断文档是否修改过if(document->Name()=="UNTITLED")//如果文档是未命名的新文档,则另存为FileSaveAs(document);//另存文档elseFileSave(document);//保存文档if(fClosing)document->Close();//如果要关闭文档break;}在上面的代码中,当执行IDM_F_SAVE命令时,fClosing为false,则程序会保存文件,但不会关闭文件;当执行IDM_F_CLOSE命令时,程序先将fClosing赋值为true,然后继续执行到IDM_F_SAVE标签,保存文档后,关闭文档.
这样巧妙的设计,既按照设计完成了功能,又减少了重复代码的工作量.
所以在实际编程时,应该巧妙地利用语法原有的特性.
3.
6.
3循环语句循环语句,又称重复语句.
它会使语句执行0次或多次,直到循环条件不满足.
如果循环执行的语句是复合语句,则会按照顺序执行,除非在语句中使用break或continue等跳转语句,跳转语句在3.
6.
4小节会介绍.
C++中有3种循环语句,分别是while、do和for.
每种循环语句会重复执行语句,直到终止表达式计算的结果为false或者遇到break语句强制终止.
其中,终止表达式必须是整型化的类型或者是可以明确地转化为整型化的类的表达式,而重复语句的执行语句部分不能是声明语句,但是可以是包含声明语句的复合语句.
同时,循环语句也是支持嵌套的,嵌套规则与选择语句相同.
循环语句的执行方式如表3-11所示.
表3-11C++循环语句的执行方式语句何时求值初始化增量while循环开始无无do循环结束无无for循环开始有有第3章C/C++语言基础·57·1.
while循环语句while循环语句的语法格式为:while(表达式)语句while语句是在每次执行语句前判断终止条件是否为true.
如果为false,则退出循环语句;如果为true,则继续执行循环语句,因此while循环有可能执行多次,也有可能一次也不执行.
其流程图如图3-7所示.
从图3-7中可以看出,程序首先判断while后的表达式的值是否为true,如果为true,则执行语句1,执行完后会继续判断表达式,直到表达式的值为false,则会执行语句2.
如下代码显示了while语句的使用.
char*trim(char*szSource)//去掉字符串头尾的内容{char*pszEOS;//定义字符指针pszEOS=szSource+strlen(szSource)-1;//设置开始指针在字符串尾while(pszEOS>=szSource&&*pszEOS循环处理字符串中的字符*pszEOS--='\0';//去掉空格字符returnszSource;//返回处理后的字符串}上面代码的功能是去掉字符串尾部的空格.
代码首先将指针指向要处理的字符串的最后一个字符的地址处,然后开始执行循环,去掉尾部的空格,直到指针到达字符串头,或者最后一个字符不是空格,即退出循环.
对于此函数,如果字符串尾部没有空格,则循环会退出.
2.
do循环语句do循环语句的语法格式如下:do语句while(表达式);do语句重复的执行语句,直到指定的终止条件表达式计算结果为0时,即退出循环.
终止条件的判断是在每次循环语句执行完一次循环后执行,因此do循环语句至少要执行一次.
其流程图如图3-8所示.
从图3-8中可以看出,程序首先执行语句1,然后判断while后的表达式的值是否为true.
如果为true,则继续执行语句1;否则会执行语句2.
如下代码显示了do语句的使用.
voidWaitKey(charASCIICode)//等待用户输入指定字符的函数{charchTemp;//定义字符变量,用于存放用户输入的字符do图3-7while语句的执行流程图图3-8do语句的执行流程图第1篇VisualC++开发基础·58·{chTemp=_getch();//接收用户输入的字符}while(chTemp!
=ASCIICode);//循环条件为判断接收到的字符是否为指定字符}上面的函数实现了等待用户按下指定按键的功能.
它会提示用户输入字符,直到输入的字符与要求的字符相同,则会退出do循环.
此功能也可以使用while循环语句实现,但是实现起来就比较繁琐,没有do循环语句简明.
可以看出,在至少需要执行一次的循环语句中使用do循环语句比较适合,否则还是使用while语句比较好.
如下代码使用while语句改写了上面的代码.
voidWaitKey(charASCIICode)//等待用户输入指定字符的函数{charchTemp;//定义字符变量,用于存放用户输入的字符chTemp=_getch();//接收用户输入的字符while(chTemp!
=ASCIICode)//循环条件为判断接收到的字符是否为指定字符{chTemp=_getch();//接收用户输入的字符}}3.
for循环语句for循环语句可以分为3部分,其语法格式如下:for(表达式1;表达式2;表达式3)语句其中,表达式1部分用于初始化循环参数,是在执行for循环语句前,首先执行的语句.
表达式2部分是整型化的表达式或可以转换成整型化的类.
在每次执行循环语句前,判断表达式2的值是否为true,决定是否继续执行.
表达式3部分用于处理循环计数,每次执行循环语句完成后执行此部分,执行完后进入下一次循环.
如图3-9显示了for循环的执行流程.
for初始化语句通常用于声明和初始化循环索引变量,判断语句用于测试循环终止条件,循环处理计数语句用于增加循环计数.
在for循环中,这3条语句任何一条都是可选的.
其中,for初始化语句可以是声明语句或表达式语句,也可以是空语句,并且可以包含多条,其间以逗号分开.
注意任何在for初始化语句中声明的对象,都是在for本地作用域内有效.
因为for语句和while语句都是循环语句,因此,二者之间是可以互相转换的.
如下面的for语句与while语句就具有相同的作用.
for(表达式1;表达式2;表达式3){//语句}图3-9for语句的执行流程图第3章C/C++语言基础·59·与表达式1;while(表达式2){//语句表达式3;}而下面的for循环语句与while循环语句都能够完成无限循环的功能.
for(;;){//要执行的语句}与while(1){//要执行的语句}虽然通常情况下,for语句的3个语句分别用于初始化、测试终止条件和递增计数,但是也可以不这样用,如下代码,作用是打印1~100之间的整数,其for语句的执行语句为空语句,在for语句的表达式语句中完成打印.
voidmain(){for(inti=0;iAtEnd())break;//判断是否到达链表尾,如果到达链表结尾,则退出for循环List->Next();//取下一个链表元素}第1篇VisualC++开发基础·60·2.
continue语句continue语句强制代码跳转到离它最近的循环继续语句中,即强制开始一次新的循环.
因此,continue语句只能依赖于循环语句.
在for循环语句中,执行continue语句,也就是执行一次"表达式2",然后执行"表达式3".
//获取输入的合法字符在字符串中的位置intGetLegalChar(char*szLegalString){char*pch;//定义指向字符的指针do{charch=_getch();//获取用户输入的字符//判断输入的字符是否在传入的字符串中存在if((pch=strchr(szLegalString,ch))==NULL)continue;//如果没有则使用continue语句,重新执行循环return(pch-szLegalString);//返回合法字符在字符串中的位置}while(1);//执行循环条件return0;//返回}3.
return语句return语句使函数直接返回到调用它的函数中去,对于主函数来说,return语句会使程序退出.
可以使用表达式,将return值传回给调用函数.
但是对于函数类型为void,构造函数和析构函数来说,不能通过return语句指定返回表达式.
其他类型的函数,必须使用return语句指定返回值.
在一个函数中可以多次使用return语句.
如果指定了表达式,则会转换成函数声明的返回值类型.
4.
goto语句goto语句可以无条件地将程序跳转到标签标识的代码段中.
要使用goto语句,必须在要跳转到的代码前使用标签标注出来.
声明方法为在程序源代码前使用标识符,在标识符后加一个冒号.
这样,在代码中就可以使用goto加标识符,从而直接跳转到指定的代码部分.
如下代码所示.
for(p=0;p02usingnamespacestd;0304longfactorial(intnumber)//递归函数的调用,功能是计算指定整数的阶乘05{06if(number>a;//接收用户输入18coutb)returna;//如果a大于b,则返回a的值elsereturnb;//否则,返回b的值}上面的代码是取两个数中较大的一个的函数,此函数通过inline关键字定义为内联函数.
除了可以指定一般函数为内联函数外,类的成员函数也可以声明为内联函数.
有以下两种方法可以声明类的成员函数为内联函数.
显式指定内联函数:在类的成员函数的定义前面加上inline关键字.
隐式指定内联函数:在类的成员函数的声明中,直接加上函数体的内容.
下面代码显示了指定类的成员函数为内联函数的方法.
classMyClass//自定义MyClass类{public:intmin()//隐式内联{if(ab)returna;//如果a大于b,则返回a值elsereturnb;//否则返回b值}在上面的代码中,MyClass类使用显式方式定义max()函数为内联函数,使用隐式方式定义min()函数为内联函数.
3.
7.
5函数的重载C++允许在同一作用域内指定相同函数名的多种函数形式,此技术称为函数重载.
重载函数允许程序员根据参数类型和个数提供函数的不同语义.
对程序员来说,函数重载就是定义相同函数名的多个函数原型,但是重载函数的返回值类型必须相同.
可以使用参数个数进行函数重载,即函数名称和返回值相同,但是参数的个数不同.
可以使用参数类型进行函数重载,即函数名称、返回值和参数个数都相同,但是参数的类型不同.
可以使用是否设置参数的默认值进行函数重载,即3.
7.
2小节中使用的AddYear()函数的例子.
可以使用const和volatile关键字重载函数.
以下代码中定义的重载函数可以实现在多种数据类型中获取较大值的功能.
voidmax(inta,intb,int&c);voidmax(doublea,doubleb,double&c);voidmax(chara,charb,char&c);3.
8指针和引用为了提高存储效率,C++中提供了指针和引用两种类型.
这两种类型也是C++数据类型中的重点和难点.
在学习本节内容时,一定要透彻理解指针和引用的概念,在运用时要能够融会贯通、举一反三.
3.
8.
1指针和指针变量不管在C还是C++中,指针类型都是一个难点和重点.
C++中的指针指向内存中一个变量或对象的存储空间.
因此,指针的定义分为两种情况,一种是指向给定类型的变量的指针,一种是指向类成员的指针.
指针变量指定变量指向的对象的类型.
对象可以是全局的、本地的或者动态分配的.
第1篇VisualC++开发基础·66·指针类型指定了指针指向的对象类型,可以是基本类型、结构或联合体.
指针变量也可以指向函数、数据和其他指针.
使用指向给定类型的函数的指针,可以在程序运行时确定指定对象选择的函数.
下面的代码是有关指针声明的几个例子.
char*szNameStr;//指向char类型的指针int*iCount;//指向int类型的指针intconst*x;//声明指针变量x,指向一个常数值int*consty=&a;//声明常指针变量y,指向一个int值int*constvolatilez=&b;//声明固定值的常指针变量在上面语句中,第一条语句声明了一个指向char类型的指针.
第二条语句声明了一个指向int类型的指针.
第三条语句声明了指针变量x,可以修改其指向不同的int类型值,但是指向的int值是不能修改的.
第四条语句声明的指针变量y是常指针,可以修改其指向的int类型的值,但是不能修改其指向其他的int值,即只能指向对象a的地址.
第五条语句声明了指针变量z,程序既不能修改其指向的值,也不能修改指针本身的取值.
3.
8.
2&和*运算符地址操作符符号为&,是一目运算符,用于获取操作数的地址.
地址操作符的操作数可以是函数定义或是表示对象的变量,但不能是位字段,也不能是使用register声明的存储类关键字.
地址操作符应用于基本类型变量、结构变量、类变量或共用体变量.
代码如下:voidprintAddressOf()//地址操作符的示例{int*pPtr;//定义整型指针变量pPtrintnArray[5];//定义整型数组pPtr=&nArray[2];//赋值指针变量指向整型数组的第二个元素coutnameagename,"%s","张三");//为student结构的name分量赋值为张三stu->age=10;//为student结构的age分量赋值为10printStudent(stu);//将stu指针传入printStudent参数,//输出学生信息}上面代码定义了student结构体和打印学生信息的printStudent()函数.
在TestPassPoint()测试函数中,定义了student类型的变量并赋值,将其传入printStudent()函数中,从而输出定义的学生信息.
3.
8.
6引用及函数的引用传递引用类型(&)是一个16位或32位的存放对象指针数,但是它的行为更像对象.
引用声明的格式如下:第3章C/C++语言基础·69·声明标识符&[限定符列表]引用名称;其中,声明标识符列出了要定义的数据类型信息,限定符列表是一个可选的包含引用定义的限定符选项,引用名称是定义的引用的名称.
在C++中,任何地址都可以转换为指针类型的对象,也可以转换成对应的引用类型.
如任何地址都可以转换为char*的对象,也可以转换成char&类型.
以下代码显示了引用类型的使用.
voidAddOne(int&a)//引用类型示例{a++;//将传入的变量的值自增1}voidprintRefrence()//打印通过引用传递的值{intx=99;//定义整型变量x,赋值为99coutb)b:a)//定义名称为min的宏,作用是获取两个值中较小的一个上面的代码定义了3个宏,分别是LENGTH、ADD和min.
其中,LENGTH宏代表一个常量,ADD宏代表一个加法表达式,min宏代表一个关系运算表达式.
在定义min宏时,使用反斜线作为续行符.
在C++中,可以使用#ifdefined和#ifdef指令判断是否定义过指定的宏.
使用#undef指令可以关闭已经使用#define指令定义的宏.
其语法格式为:#undef宏名称其中,宏名称表示要取消的宏的名称.
以下代码会取消对LENGTH宏的定义,在后面代码中如果使用LENGTH宏将会产生错误.
#undefLENGTH3.
9.
2文件包含在C++程序中,一个系统可以由多个程序模块组成,每个程序模块由多个文件组成,这就会出现在一个文件中引用其他文件中的内容的情况,此时需要使用#include文件包含预处理.
#include指令告诉预处理器在使用此指令的文件中包含指定文件中的代码.
文件包含支持嵌套,即被包含的文件中也可以使用#include指令包含其他文件.
可以将用到的常数和宏定义放置到文件中,然后使用#include指令将这些定义添加到任何需要使用这些常数和宏的源文件中.
#include指令对于组织外部变量和复杂的数据类型来说非常有用.
使用#include指令使得在多处使用的定义可以只在一处定义.
#include指令的语法格式如下:#include"文件名"#include其中,文件名表示要加入内容所在的文件名,可以指定文件所在路径.
文件名的语法格式根据操作系统的不同会有差别.
#include的两种语法格式的功能是相同的,区别仅在于当没有指定完整的文件路径时,预处理器查找头文件的路径有所不同.
当使用第一种语法指定文件包含时,会首先从包括#include语句的文件所在的路径下查找,然后从其他包含此文件的文件所在的路径查找,再从/I编译选项指定的路径中查找,最后会在INCLUDE环境变量中指定的路径中查找.
当使用第二种语法指定文件包含时,会先从/I编译选项指定的路径中查找,然后在INCLUDE环境变量中指定的路径中查找.
以下代码是#include指令的使用代码.
#include#include"Sample.
h"第3章C/C++语言基础·71·上面的代码包含stdio.
h文件和Sample.
h文件.
其中,stdio.
h文件会在/I编译选项指定的路径和INCLUDE环境变量中指定的路径中查找,而Sample.
h会首先从文件本地路径中查找.
3.
9.
3条件编译C++支持条件预编译指令控制源文件编译的部分.
条件编译指令有#if、#elif、#else和#endif指令.
如果编译指令#if后的表达式为非0值,则其后的代码会进行编译,直到#endif指令结束处.
在源文件中,每个#if指令必须与#endif指令配对.
在#if和#endif之间可以使用多个#elif指令判断多种条件,但是其中最多只能有一条#else指令.
另外,如果使用#else指令,则必须是#endif指令前的最后一条指令.
条件编译指令是支持嵌套的,每个嵌套的#else、#elif和#endif指令与距离其最近的#if指令配对.
通常情况下,条件编译会与#defined配对使用,判断指定的宏名称是否已经定义,确定是否编译指定代码.
代码如下:#ifdefined(DB_SQLSERVER)//如果定义了DB_SQLSERVERconnectSQLServer();//连接SQLServer数据库#elifdefined(DB_ACCESS)//如果定义了DB_ACCESSconnectACCESS();//连接Access数据库#else//如果没有定义数据库类型printerror();//输出错误信息#endif在上面代码中,首先使用#ifdefined(DB_SQLSERVER)语句判断是否定义了DB_SQLSERVER宏.
如果定义了该宏,会使用connectSQLServer()函数连接SQLServer数据库;如果没有定义DB_SQLSERVER宏,则继续判断是否定义了DB_ACCESS宏.
如果定义了DB_ACCESS宏,则会使用connectACCESS()函数连接Access数据库,否则,会报告错误.
3.
10文件操作文件是操作系统组织数据和操作的基本元素.
计算机从最初的科学计算向前迈进的第一步就是文件系统.
文件将数据和操作分单元存储,可以写入数据、读取数据等.
因此,对文件的操作也主要分为打开文件、读文件、写文件和关闭文件.
本节将介绍有关文件的操作.
3.
10.
1打开文件要对文件进行读写,首先需要打开文件,使用fopen()函数和_wfopen()函数可以打开文件.
其原型为:FILE*fopen(constchar*filename,//表示要打开的文件名称constchar*mode);//打开文件时的访问权限类型第1篇VisualC++开发基础·72·FILE*_wfopen(constwchar_t*filename,constwchar_t*mode);其中,mode参数的有效取值如下.
r:读取文件打开.
如果文件不存在或查找不到,则fopen()函数调用失败.
w:打开空文件写入.
如果指定的文件存在,则内容会被删除.
a:打开文件,从文件尾开始添加内容,在向文件中写入新数据前不删除EOF标记.
如果文件不存在,则创建文件.
r+:打开文件,既可以从文件中读取,也可以向文件中写入,但是文件必须存在.
w+:打开空文件,既可以从文件中读取,也可以向文件中写入,如果文件存在,则会删除其中的数据.
a+:打开文件,既可以从文件中读取,也可以向文件中写入.
在新数据被写入文件之前会移除EOF标记.
当写入操作完成时,会恢复EOF标记.
如果文件不存在,则会创建新文件.
FILE表示返回的打开的文件指针.
如果返回值是NULL指针,则表示在打开文件时发生错误了.
fopen()函数和_wfopen()函数的区别在于_wfopen()函数是fopen()函数的多字符集版本.
3.
10.
2从文件读取数据从文件或数据流中读取数据使用fread()函数,其原型为:size_tfread(void*buffer,//指定存储数据的本地存储空间的指针size_tsize,//指定存储区的大小size_tcount,//指定要读取的数据项的最大个数FILE*stream//指向FILE结构的指针,是使用fopen()函数//打开的文件句柄);fread()函数会从文件流stream中读取size参数和count参数之间较小数目的数据,存储到buffer参数指定的缓冲区中.
函数的返回值是实际读取的数据长度,当读取的过程发生错误或已经读到文件结尾处时,返回值可能小于参数count指定的值.
使用feof()函数和ferror()函数可以区分这两种情况.
如果参数size或参数count为0,则函数返回0,并且不会读取数据.
3.
10.
3向文件写入数据向文件中写数据使用fwrite()函数,其原型为:size_tfwrite(constvoid*buffer,//指定存放要写入的数据的存储空间的指针size_tsize,//指定存储区的大小size_tcount,//指定要写入的数据项的最大个数FILE*stream//指向FILE结构的指针,即使用fopen()函数//打开的文件句柄);第3章C/C++语言基础·73·fwrite()函数会将buffer参数指定缓冲区中的数据写入文件流stream中,写入的数据个数是size参数和count参数之间较小的数目.
函数返回实际写入的数据长度,当写数据发生错误时,则返回值可能小于参数count指定的值.
如果参数size或参数count为0,则函数返回0,并且不会向文件流中写任何数据.
3.
10.
4关闭文件C++中使用fclose()函数或_fcloseall()函数关闭文件.
其中fclose()函数关闭文件流,_fcloseall()函数关闭所有打开的文件流.
_fcloseall()函数还可以关闭和删除tmpfile()函数创建的临时文件.
当文件流关闭时,会释放系统分配的缓冲区.
函数原型为:intfclose(FILE*stream);//指向FILE结构的指针int_fcloseall(void);如果成功关闭文件流,则fclose()函数返回0.
_fcloseall()函数用于返回关闭的文件流的个数.
当关闭文件流发生错误时,函数会返回EOF.
3.
10.
5文件操作示例从上面讲解的内容可以看出文件操作的过程是这样的,先根据需求使用合适的权限打开文件,判断是否成功打开文件,并对文件进行读写,文件使用完后,需要关闭文件句柄.
以下代码是文件操作的示例.
01#include02#include0304FILE*stream,*stream1,*stream2;0506voidmain()07{08intnumclosed;09charlist[30];//存放从文件中读取的数据10inti,numread,numwritten;//读取的数目,写入的数目1112//打开文件data进行读,如果文件不存在,则失败13if((stream1=fopen("data","r"))==NULL)14printf("打开文件'data'进行读失败\n");15else16printf("打开文件'data'进行读\n");1718//打开文件data2进行写操作19if((stream2=fopen("data2","w+NULL)20printf("打开文件'data2'进行写失败\n");21else22printf("打开文件'data2'进行写\n");2324//使用文本模式打开文件,对文件进行写操作25if((stream=fopen("fread.
out","w+t"))!
=NULL)26{27//向文件流中写入25个字符28for(i=0;i<25;i++)第1篇VisualC++开发基础·74·29list[i]=(char)('z'-i);3031numwritten=fwrite(list,sizeof(char),25,stream);32printf("写入%d个字符\n",numwritten);33fclose(stream);34}35else36printf("打开文件fread.
out时,发生错误,无法写数据到文件中\n");3738if((stream=fopen("fread.
out","r+t"))!
=NULL)39{40//从文件中读取25个字符41numread=fread(list,sizeof(char),25,stream);42printf("读取的数据个数=%d\n",numread);43printf("读取的内容为=%.
25s\n",list);44fclose(stream);45}46else47printf("打开文件fread.
out时,发生错误,无法从文件中读取数据\n");4849//关闭文件50if(fclose(stream2))51printf("关闭文件'data2'失败\n");5253//关闭其他打开的文件54numclosed=_fcloseall();55printf("使用函数_fcloseall关闭的文件数目为:%u\n",numclosed);56system("pause");57}上面代码演示了操作文件的方法,包括打开文件、读文件、写文件和关闭文件.
其中,对文件句柄stream1和stream2没有进行读写操作,对文件句柄stream进行了读写操作.
首先向文件中写入25个字母,然后再从文件中读取这25个字母,最后关闭文件.
代码运行结果如图3-12所示.
图3-12代码运行结果3.
11本章小结本章主要讲解了C++的基本语法,在与C语言语法对比的基础上,讲述了C++语言特有的特性.
从基本的变量和常量,到控制语句的语法以及函数的概念,C++在继承C的基础上做了适当调整.
C++中的指针和引用是C++语法中的一个难点.
预处理的理解也是熟悉C++语言必不可少的.
最后以文件操作为例,讲述了在C++中操作文件的方法,并结合实例进行说明.
第4章将讲解C++语言中的面向对象程序设计的知识.
第3章C/C++语言基础·75·3.
12习题1.
定义一个结构体Person,用来记录人的姓名、性别、年龄、身份证号码和年收入.
【思路】依据结构体各成员存放的数据的情况,来决定所使用的数据类型.
【示例代码】structPerson{charname[9];charsex[3];shortage;charidentityCard[19];floatincome;};2.
有一个式子:(x+303*y–64)/z.
x、y、z分别为int型的变量,编程实现:从用户处获取各个变量的值,默认赋值1,代入表达式中计算并输出计算结果.
【思路】通过cin获取用户的输入,代入表达式中求值,用cout输出.
如图3-13所示,为编程实现效果的一种方式.
3.
声明一个short类型的数组Num,包含10个数据成员,成员依条件赋值,条件是:3*n+1(n是大于0小于11的整数).
然后通过指针pNum来修改数组中下标为偶数的成员,统一设置为0,最后输出所有的数组成员.
【思路】按规则为数组赋值,然后用指针指向数组并按照规则修改数组成员,最后循环输出所有的数组成员.
如图3-14所示为演示的一种输出效果.
图3-13程序运行效果图3-14数组输出效果4.
依据用户输入的完整文件名(包含路径),打开并读取文本文件内容,然后显示出来.
【思路】使用fopen()打开文件、fread()读取文件、feof()判断是否到达文件末尾.
如图3-15所示为读取文件内容的效果.
图3-15读取文件内容效果

香港、美国、日本、韩国、新加坡、越南、泰国、加拿大、英国、德国、法国等VPS,全球独立服务器99元起步 湘南科技

全球独立服务器、站群多IP服务器、VPS(哪个国家都有),香港、美国、日本、韩国、新加坡、越南、泰国、加拿大、英国、德国、法国等等99元起步,湘南科技郴州市湘南科技有限公司官方网址:www.xiangnankeji.cn产品内容:全球独立服务器、站群多IP服务器、VPS(哪个国家都有),香港、美国、日本、韩国、新加坡、越南、泰国、加拿大、英国、德国、法国等等99元起步,湘南科技VPS价格表:独立服...

易探云韩国云服务器仅50元/月,510元/年起

韩国云服务器哪个好?韩国云服务器好用吗?韩国是距离我国很近的一个国家,很多站长用户在考虑国外云服务器时,也会将韩国云服务器列入其中。绝大部分用户都是接触的免备案香港和美国居多,在加上服务器确实不错,所以形成了习惯性依赖。但也有不少用户开始寻找其它的海外免备案云服务器,比如韩国云服务器。下面云服务器网(yuntue.com)就推荐最好用的韩国cn2云服务器,韩国CN2云服务器租用推荐。为什么推荐租用...

Hostodo美国独立日优惠套餐年付13.99美元起,拉斯维加斯/迈阿密机房

Hostodo又发布了几款针对7月4日美国独立日的优惠套餐(Independence Day Super Sale),均为年付,基于KVM架构,采用NVMe硬盘,最低13.99美元起,可选拉斯维加斯或者迈阿密机房。这是一家成立于2014年的国外VPS主机商,主打低价VPS套餐且年付为主,基于OpenVZ和KVM架构,产品性能一般,支持使用PayPal或者支付宝等付款方式。商家客服响应也比较一般,推...

对象名无效为你推荐
yw372:Com怎么把www.jiayw.com 家园影院的电影下载到本地!!phpcms模板PHPCMS V9模板googlepr谷歌 PR值是什么意思yixingjia通配符的使用方法腾讯公司电话腾讯公司总部电话多少小型汽车网上自主编号申请成都新车上牌办理流程和办理条件是如何的申请400电话400电话申请怎么办理?是不是免费的?美国独立美国是什么时候独立的?如何发帖子网上怎么发帖子?powerbydedecms织梦dedecms怎么去掉power by dedecms方法
www二级域名 免费二级域名 韩国vps com域名抢注 注册cn域名 云主机51web 韩国网名大全 南通服务器 vip域名 万网空间购买 空间登录首页 免费网络 qq金券 万网空间 免费php空间 稳定空间 电信主机托管 hdroad 新疆服务器 美国主机 更多