Visual C++ 2013入门经典(第7版) [Ivor Horton’s Beginning Visual C++ 2013]

Visual C++ 2013入门经典(第7版) [Ivor Horton’s Beginning Visual C++ 2013] pdf epub mobi txt 电子书 下载 2025

[美] 霍尔顿(Horton I.) 著,李周芳,江凌 译
图书标签:
  • Visual C++
  • C++
  • Visual Studio
  • 编程入门
  • Windows 编程
  • 入门经典
  • Ivor Horton
  • 第7版
  • 开发工具
  • C++教程
想要找书就要到 新城书站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 清华大学出版社
ISBN:9787302385059
版次:1
商品编码:11611761
品牌:清华大学
包装:平装
丛书名: .NET开发经典名著
外文名称:Ivor Horton’s Beginning Visual C++ 2013
开本:16开
出版时间:2015-01-01
用纸:胶版纸
页数:774

具体描述

产品特色

编辑推荐

  《Visual C++ 2012入门经典(第6版)》升级版本,第七版
  编程导师Ivor Horton经典作品,连续十五年
  作者经典作品包含:《C语言入门经典(第5版)》《 C++入门经典(第3版)》《Java 7入门经典》

Ivor Horton经典作品:

内容简介

  著名编程图书作家Ivor Horton引导学习Visual C++ 2013这本C++语言畅销书遵循Ivor Horton一贯的畅销风格。Horton非常详尽地介绍了标准C++语言和Visual C++。
  《Visual C++ 2013入门经典(第7版)》根据Visual C++ 2013进行了更新,展示了如何使用Visual C++建立实用的应用程序。阅读本书不需要任何编程经验。作者使用大量循序渐进的编程示例,引导读者掌握C++开发的全部奥秘。
  《Visual C++ 2013入门经典(第7版)》特色
  ◆ 介绍C++编程的基本概念以及Visual C++开发环境的要点
  ◆ 从简单的过程式程序开始解释C++语言,逐步过渡到类和面向对象编程
  ◆ 演示如何在各种环境下应用标准模板库(STL)
  ◆ 揭示每个Windows桌面应用程序中的基本元素
  ◆ 展示如何使用MFC建立图形用户界面以编写Windows应用程序
  ◆ 通过一个在Windows 8下执行的游戏示例,说明如何开发Windows Store应用程序

作者简介

  Ivor Horton,是世界著名计算机图书作家,独立顾问,帮助无数程序员步入编程殿堂。他曾在IBM工作多年,以优异成绩拥有数学学士学位。他的资历包括:使用大多数语言(如在多种机器上使用汇编语言和高级语言)进行编程,实时编程,设计和实现实时闭环工业控制系统。Horton拥有丰富的面向工程师和科学家的编程教学经验(教学内容包括C、C++、Fortran、PL/1、APL等)。同时,他还是机械、加工和电子CAD系统、机械CAM系统和DNC/CNC系统方面的专家。

目录

第1章 使用Visual C++编程 1
1.1 使用Visual C++学习 1
1.2 编写C++应用程序 2
1.3 学习桌面应用程序的编程 2
1.3.1 学习C++ 3
1.3.2 C++概念 3
1.3.3 控制台应用程序 4
1.3.4 Windows编程概念 4
1.4 集成开发环境简介 6
1.4.1 编辑器 6
1.4.2 编译器 6
1.4.3 链接器 6
1.4.4 库 7
1.4.5 标准C++库 7
1.4.6 Microsoft库 7
1.5 使用IDE 7
1.5.1 工具栏选项 8
1.5.2 可停靠的工具栏 9
1.5.3 文档 9
1.5.4 项目和解决方案 9
1.5.5 设置Visual C++的选项 16
1.5.6 创建和执行Windows应用程序 17
1.6 小结 19
1.7 本章主要内容 19

第2章 数据、变量和计算 21
2.1 C++程序结构 21
2.1.1 main()函数 28
2.1.2 程序语句 28
2.1.3 空白 30
2.1.4 语句块 30
2.1.5 自动生成的控制台程序 30
2.2 定义变量 32
2.2.1 命名变量 32
2.2.2 关键字 32
2.2.3 声明变量 33
2.2.4 变量的初始值 33
2.3 基本数据类型 34
2.3.1 整型变量 34
2.3.2 字符数据类型 35
2.3.3 整型修饰符 36
2.3.4 布尔类型 36
2.3.5 浮点类型 37
2.3.6 C++中的基本类型 37
2.3.7 字面值 38
2.3.8 定义类型的别名 39
2.4 基本的输入/输出操作 40
2.4.1 从键盘输入 40
2.4.2 到命令行的输出 40
2.4.3 格式化输出 41
2.4.4 转义序列 42
2.5 C++中的计算 44
2.5.1 赋值语句 44
2.5.2 算术运算 44
2.5.3 计算余数 49
2.5.4 修改变量 49
2.5.5 增量和减量运算符 50
2.5.6 计算的顺序 52
2.6 类型转换和类型强制转换 53
2.6.1 赋值语句中的类型转换 54
2.6.2 显式类型转换 54
2.6.3 老式的类型强制转换 55
2.7 auto关键字 55
2.8 类型的确定 56
2.9 按位运算符 56
2.9.1 按位AND运算符 57
2.9.2 按位OR运算符 58
2.9.3 按位XOR运算符 59
2.9.4 按位NOT运算符 60
2.9.5 移位运算符 60
2.10 lvalue和rvalue 61
2.11 了解存储时间和作用域 62
2.11.1 自动变量 62
2.11.2 决定变量声明的位置 65
2.11.3 全局变量 65
2.11.4 静态变量 68
2.12 具有特定值集的变量 68
2.12.1 旧枚举 68
2.12.2 类型安全的枚举 70
2.13 名称空间 72
2.13.1 声明名称空间 73
2.13.2 多个名称空间 74
2.14 小结 75
2.15 练习 75
2.16 本章主要内容 76

第3章 判断和循环 79
3.1 比较数据值 79
3.1.1 if语句 80
3.1.2 嵌套的if语句 81
3.1.3 嵌套的if-else语句 85
3.1.4 逻辑运算符和表达式 87
3.1.5 条件运算符 89
3.1.6 switch语句 91
3.1.7 无条件转移 94
3.2 重复执行语句块 95
3.2.1 循环的概念 95
3.2.2 for循环的变体 98
3.2.3 while循环 105
3.2.4 do-while循环 107
3.2.5 基于范围的循环 108
3.2.6 嵌套的循环 108
3.3 小结 111
3.4 练习 111
3.5 本章主要内容 111

第4章 数组、字符串和指针 113
4.1 处理多个相同类型的数据值 113
4.1.1 数组 114
4.1.2 声明数组 114
4.1.3 初始化数组 117
4.1.4 使用基于范围的for循环 118
4.1.5 多维数组 119
4.2 处理C样式的字符串 123
4.2.1 字符串输入 124
4.2.2 字符串字面量 125
4.2.3 给字符串使用基于范围的for循环 126
4.3 间接数据访问 128
4.3.1 指针的概念 128
4.3.2 声明指针 128
4.3.3 使用指针 129
4.3.4 初始化指针 130
4.3.5 指向char类型的指针 132
4.3.6 sizeof操作符 136
4.3.7 常量指针和指向常量的指针 136
4.3.8 指针和数组 138
4.4 动态内存分配 144
4.4.1 堆的别名—— 空闲存储器 144
4.4.2 new和delete操作符 145
4.4.3 为数组动态分配内存 146
4.4.4 多维数组的动态分配 148
4.5 使用引用 149
4.5.1 引用的概念 149
4.5.2 声明并初始化lvalue引用 149
4.5.3 在基于范围的for循环中
使用引用 150
4.5.4 创建rvalue引用 151
4.6 字符串的库函数 151
4.6.1 确定以空字符结尾的字符串的长度 152
4.6.2 连接以空字符结尾的字符串 152
4.6.3 复制以空字符结尾的字符串 153
4.6.4 比较以空字符结尾的字符串 154
4.6.5 搜索以空字符结尾的字符串 154
4.7 小结 156
4.8 练习 156
4.9 本章主要内容 157

第5章 程序结构(1) 159
5.1 理解函数 159
5.1.1 需要函数的原因 160
5.1.2 函数的结构 161
5.1.3 替代的函数语法 163
5.1.4 使用函数 163
5.2 给函数传递实参 166
5.2.1 按值传递机制 167
5.2.2 给函数传递指针实参 168
5.2.3 给函数传递数组 169
5.2.4 给函数传递引用实参 173
5.2.5 使用const修饰符 175
5.2.6 rvalue引用形参 176
5.2.7 main()函数的实参 178
5.2.8 接受数量不定的函数实参 179
5.3 从函数返回值 181
5.3.1 返回指针 181
5.3.2 返回引用 184
5.3.3 函数中的静态变量 186
5.4 递归函数调用 188
5.5 小结 191
5.6 练习 191
5.7 本章主要内容 192

第6章 程序结构(2) 193
6.1 函数指针 193
6.1.1 声明函数指针 194
6.1.2 函数指针作为实参 196
6.1.3 函数指针的数组 198
6.2 初始化函数形参 198
6.3 异常 200
6.3.1 抛出异常 202
6.3.2 捕获异常 202
6.3.3 重新抛出异常 204
6.3.4 MFC中的异常处理 204
6.4 处理内存分配错误 205
6.5 函数重载 206
6.5.1 函数重载的概念 207
6.5.2 引用类型和重载选择 209
6.5.3 何时重载函数 210
6.6 函数模板 210
6.7 使用decltype操作符 212
6.8 使用函数的示例 215
6.8.1 实现计算器 215
6.8.2 从字符串中删除空格 217
6.8.3 计算表达式的值 218
6.8.4 获得项值 220
6.8.5 分析数 221
6.8.6 整合程序 224
6.8.7 扩展程序 225
6.8.8 提取子字符串 227
6.8.9 运行修改过的程序 229
6.9 小结 229
6.10 练习 229
6.11 本章主要内容 230

第7章 自定义数据类型 233
7.1 C++中的结构 233
7.1.1 结构的概念 234
7.1.2 定义结构 234
7.1.3 初始化结构 234
7.1.4 访问结构的成员 235
7.1.5 伴随结构的智能感知帮助 238
7.1.6 RECT结构 239
7.1.7 使用指针处理结构 240
7.2 数据类型、对象、类和实例 241
7.2.1 类的起源 243
7.2.2 类的操作 243
7.2.3 术语 244
7.3 理解类 244
7.3.1 定义类 244
7.3.2 声明类的对象 245
7.3.3 访问类的数据成员 245
7.3.4 对象成员的初始化 247
7.3.5 初始化类成员 248
7.3.6 类的成员函数 248
7.3.7 在类的外部定义成员函数 250
7.3.8 内联函数 251
7.4 类构造函数 252
7.4.1 构造函数的概念 252
7.4.2 默认的构造函数 254
7.4.3 默认的形参值 256
7.4.4 在构造函数中使用初始化列表 258
7.4.5 声明显式的构造函数 259
7.4.6 委托构造函数 260
7.5 类的私有成员 260
7.5.1 访问私有类成员 263
7.5.2 类的友元函数 263
7.5.3 默认复制构造函数 266
7.6 this指针 267
7.7 类的const对象 269
7.7.1 类的const成员函数 270
7.7.2 类外部的成员函数定义 271
7.8 类对象的数组 271
7.9 类的静态成员 273
7.9.1 类的静态数据成员 273
7.9.2 类的静态函数成员 276
7.10 类对象的指针和引用 277
7.10.1 类对象的指针 277
7.10.2 类对象的引用 279
7.11 小结 280
7.12 练习 280
7.13 本章主要内容 281

第8章 深入理解类 283
8.1 类析构函数 283
8.1.1 析构函数的概念 284
8.1.2 默认的析构函数 284
8.1.3 析构函数与动态内存分配 286
8.2 实现复制构造函数 289
8.3 运算符重载 291
8.3.1 实现重载的运算符 291

精彩书摘

  2. #include指令—— 头文件
  在注释之后有一个#include指令:
  #include
  之所以称其为指令,是因为它命令编译器完成某项任务—— 此处是在编译之前,在此程序的源文件中插入文件iostream的内容,该文件名位于尖括号之间。iostream文件称为头文件,因为它总是插入到另一个源文件中。iostream头文件是标准C++库的一部分,它包含一些使用输入和输出语句所需的定义。如果没有在此程序中包括iostream的内容,那么不能编译这个程序,因为在这个程序中使用的输出语句依赖该文件中的一些定义。Visual C++提供了许多不同的标准头文件,它们具有各种各样的功能。在进一步学习语言工具时,将看到更多的头文件。
  由#include指令插入的文件的名称不一定写在尖括号之间。头文件名也可以写在双引号中。因此上面的代码也可以写成:
  #include "iostream"
  两者之间的唯一区别是编译器将在什么地方查找此文件。如果头文件名是用双引号引起来的,则编译器先在包含此指令的源文件所在的目录中搜索头文件。如果头文件未找到,编译器再搜索存储标准头文件的目录。
  如果文件名是用尖括号括起来的,则编译器只搜索包含标准头文件的目录。因此,想在源文件中包含标准头文件时,应该将文件名用尖括号括起来,因为这样的搜索速度更快。而要包含其他头文件,一般是自己创建的头文件,则应该将文件名用双引号引起来;否则,根本找不到。
  #include语句是几个预处理器指令中的一个,本书后面将介绍其他预处理指令。编辑器会在编辑窗口中用蓝色突出显示它们。预处理器指令是由编译的预处理阶段执行的命令,这个阶段在代码编译成目标代码之前执行,在编译源代码之前,预处理器指令通常以某种方式作用于它们。预处理器指令都以#字符开头。
  3. 名称空间和using声明
  如第1章所述,标准库是一个大型的例程集合,用于执行许多常见的任务,如处理输入和输出,以及执行基本的数学计算。由于标准库中的这些例程以及其他具有名称的事物数量巨大,因此用户使用的名称可能无意中与标准库中的名称雷同。名称空间是一种机制,它可以将无意中使用重名的风险降至最低,其方法是将一组给定的名称(如标准库中的名称)与一种姓(family name)关联起来,这种姓就是名称空间名称。
  在名称空间的代码中定义的每个名称都有一个关联的名称空间名称。标准库工具定义在std名称空间内,所以标准库中的每一项都有自己的名称,以及作为限定符的名称空间名称std。标准库中cout和endl的全名是std::cout和std::endl,第1章介绍过这些名称。将名称空间名称和实体名分隔开的两个冒号构成了称为“作用域解析运算符”的运算符,本书后面将介绍这种运算符的其他用途。在程序中使用全名会使代码看起来有点混乱,所以最好使用不由名称空间名称std限定的简化名。在前面的程序中,iostream的#include指令后面的两行代码使之得以实现:
  using std::cout;
  using std::endl;
  这些是using声明,它们告诉编译器,要在不指定名称空间名称的情况下使用名称空间std中的名称cout和endl。编译器假定,在第一个using声明之后,只要使用名称cout,就表示std::cout。名称cout表示对应于命令行的标准输出流,名称endl表示换行符,并刷新输出缓存。本章后面会详细介绍名称空间,包括如何自定义名称空间。
  2.1.1 main()函数
  上述示例中的函数main()包括将它定义为main()的函数头,以及从第一个左大括号({)到对应的右大括号(})之间的所有语句。这对括号将这个函数中的可执行语句包围起来,它们总称为函数体。
  所有函数都包括一个定义函数名称的头,然后是函数体,它由包括在大括号之间的一些程序语句组成。函数体也可以不包含任何语句,这时它不做任何事情。
  不做任何事情的函数似乎有些多余,但是在编写大程序时,一开始可以先勾画出函数中的完整程序结构,而忽略许多函数的代码,使它们有一个空的或者最小的函数体。这意味着,可以随时编译和执行包含所有函数的整个程序,并逐步给函数添加详细的代码。
  2.1.2 程序语句
  main()函数体的每个程序语句都以一个分号结束。分号表示语句的结束,而不是这一行的结束。因此,为了使代码更易于理解,可以把一个语句扩展成几行,也可以把几个语句放在同一行中。程序语句是定义程序功能的基本单元。这有点像文章中一个段落的句子,每个句子都独立地表达一个行为或想法,和这个段落中的其他句子联系和组合起来,就表达出比较全面的想法。一个语句就是计算机将要执行的一个行为的自包含定义,和其他语句组合起来, 就可以定义比较复杂的行为或计算。
  函数的行为始终由一些语句来表达,每个语句都以分号结束。看看刚才编写的示例中的语句,大致了解它是如何运行的。本章后面将讨论每种类型的语句。
  在main()函数体中,第一个语句是:
  int apples, oranges; // Declare two integer variables
  这个语句定义了两个变量apples和oranges。变量是一段已命名的计算机内存,用于存储数据,引入一个或多个变量名称的语句称为变量声明。关键字int表明apples和oranges变量将存储整数值。每当把一个变量的名称引入程序时,都要指定它将存储的数据类型,这称为变量的类型。
  接下来的这个语句声明了另一个整型变量fruit:
  int fruit; // ...then another one
  虽然可以在同一个语句中声明几个变量,如同前面的语句声明apples和oranges那样。但是,一般最好用一个语句声明一个变量,独占一行,这样就可以单独注释,以解释它们的用途。
  示例中的下一行代码是:
  apples = 5; oranges = 6; // Set initial values
  这行代码包含两个语句,每个语句都以一个分号结束。这样做的目的是说明可以把多个语句放在一行中。这不是强制的,但良好的编程习惯一般是一行只编写一个语句,使代码较容易理解。良好的编程习惯是采用使代码易于理解、且使出错的可能性降至最低的编码方法。
  这两个语句分别将数值5和6存储到变量apples和oranges中。这些语句称为赋值语句,因为它们把新值赋给变量,=是赋值运算符。
  下一个语句是:
  fruit = apples + oranges; // Get the total fruit
  这也是一个赋值语句,但稍有不同,因为在赋值运算符的右边是一个算术表达式。这个语句把存储在变量apples和oranges中的数值相加,然后在变量fruit中存储结果。
  下面的3个语句是:
  cout << endl; // Start output on a new line
  cout << "Oranges are not the only fruit... " << endl
  << "- and we have " << fruit << " fruits in all.";
  cout << endl; // Output a new line character
  它们都是输出语句。第一个语句把由endl表示的换行符发送到屏幕的命令行中。在C++中,输入的来源或输出的目的地称为流。名称cout指定“标准的”输出流,运算符<<表明,该运算符右边的内容将发送到输出流cout。<<运算符“指出”数据流动的方向,从这个运算符右边的变量、字符串或表达式到左边的输出目的地。因此,在第一个语句中,由名称endl表示的值(即换行符)将发送到由名称cout标识的流—— 传输到cout的数据会写入命令行。把endl发送到流,也会刷新流缓存,然后把所有输出发送到命令行。
  名称cout和运算符<<的含义定义在头文件iostream中,该文件利用#include指令在程序代码中添加。cout是标准库中的名称,所以它在名称空间std内。如果不使用using指令,就不会识别cout,除非使用了其全限定名std::cout。cout定义为表示标准输出流,因此不应当把它用于其他目的,将相同的名称用于不同的事情很可能引起混淆。
  第2个输出语句扩展成如下两行:
  cout << "Oranges are not the only fruit... " << endl
  << "- and we have " << fruit << " fruits in all.";
  如前所述,每个语句都可以扩展成许多行。语句的结束始终用分号表示,而不是一行的结束。编译器将读取连续的行,并把它们组合成一个语句,直至发现定义该语句结束的分号。当然,这也意味着,如果忘记在语句的结尾处放置分号,那么编译器将假定下一行是同一语句的一部分,并将它们连接到一起。这通常会产生编译器无法理解的东西,所以您将得到一个错误消息。
  这个语句将文本字符串"Oranges are not the only fruit…"发送到命令行,后跟另一个换行符(endl),然后是另一个文本字符串"- and we have ",接着是存储在变量fruit中的值,最后是另一个文本字符串"fruits in all."。可以按照这种方法把想输出的一系列内容串起来。这个语句从左向右执行,每一项都依次发送到cout。注意,发送到cout的每一项的前面都有自己的<<运算符。
  第三个也就是最后一个输出语句把另一个换行符发送到屏幕,这3个语句将生成前述的输出。这个程序中的最后一个语句是:
  return 0; // Exit the program
  它将终止main()函数的执行,从而停止这个程序的执行。控制权返回到操作系统,返回的代码0告诉操作系统:应用程序成功终止。忽略main()的return语句,程序应能编译并执行。本章的后面将详细地讨论所有这些语句。
  程序中的语句按照编写它们的顺序执行,除非一个语句明确改变了这个自然顺序。第3章将讨论改变执行顺序的语句。
  2.1.3 空白
  空白包含空格、制表符、换行符、换页符和注释的任意序列。空白将语句的各个部分分隔开,从而使编译器能够识别语句中的一个元素(如int)在何处结束,下一个元素在何处开始。否则,将忽略空白,且不会产生任何影响。
  以下面的语句为例:
  int fruit; // ...then another one
  为了使编译器能够区分int和fruit,它们之间至少有一个空白字符,但是如果添加更多的空白字符,它们将被忽略。这一行分号后面的内容全部是空白,所以都被忽略。
  另一方面,下面的语句:
  fruit = apples + oranges; // Get the total fruit
  fruit和=之间,=和apples之间不需要空白字符,但也可以添加一些空白字符。这是因为=不是字母或数字字符,所以编译器可以将它与其周围的内容区分开。类似地,符号+的两边也不需要有空白字符,但是也可以添加一些。
  除了在语句元素之间用作分隔符的空白之外,编译器将忽略其他空白(当然,在双引号之间的一串字符中使用的空白除外)。可以添加一些空白,使程序更具可读性,记住,每当出现分号时,语句就结束。
  2.1.4 语句块
  可以把几个语句括在一对大括号中,这时它们就变成了块或复合语句。函数体就是块的一个示例。可以把这样的复合语句看成单个语句(在第3章讨论判断语句时,将看到这种情况)。只要是可以放单个语句的地方,都可以放置一个用大括号括起来的语句块。因此,块可以置入其他块中。实际上,块可以嵌套(一个块在另一个块内)至任意深度。
  2.1.5 自动生成的控制台程序
  上一个示例生成了一个没有源文件的空项目,然后添加了源文件。如果允许Application Wizard生成这个项目,如第1章所述,则这个项目将包含几个文件,下面深入分析它们的内容。创建一个新的Win32控制台项目Ex2_01A,这次允许Application Wizard完成这个项目,而不在Application Settings对话框中设置任何选项。这个项目有4个包含代码的文件:Ex2_01A.cpp和stdafx.cpp源文件、stdafx.h头文件以及targetver.h文件,其中targetver.h文件指定能运行应用程序的Windows的最早版本。这表示一个不执行任何任务的有效程序。从主菜单上选择File | Close Solution菜单项,可以关闭打开的项目。在现有项目打开的情况下,可以创建一个新项目,这时将自动关闭旧项目,除非选择在相同的解决方案中添加它。
  Ex2_01A.cpp的内容是:
  // Ex2_01A.cpp : Defines the entry point for the console application.
  //
  #include "stdafx.h"
  int _tmain(int argc, _TCHAR* argv[])
  {
  return 0;
  }
  这确实和前一个示例不同。其中有一个用于stdafx.h头文件的#include指令,和程序执行的起始函数_tmain(),而不是main()。第5章将介绍函数头中圆括号的内容。
  1. 预编译的头文件
  Application Wizard生成的stdafx.h头文件是该项目的一部分,观察一下其中的代码,将看到还有3个#include指令,分别用于前面提到的targetver.h头文件,以及标准库头文件stdio.h和tchar.h。stdio.h是用于标准I/O的老式头文件,在C++当前的标准出台之前使用,它的功能和iostream头文件类似,但没有定义相同的名称。这个控制台示例使用iostream符号,所以需要包含它。tchar.h是Microsoft特有的头文件,它定义文本函数。
  stdafx.h仅在修改代码时编译,而不是在每次编译程序时重新编译它。编译stdafx.h会得到一个.pch文件(预编译的头文件),只有没有对应的.pch文件,或者.pch文件的时间戳比stdafx.h文件的时间戳早,编译器才重新编译stdafx.h。一些标准库头文件非常大,所以这个功能可以显著减少编译项目所需的时间。如果仅在Ex2_01A.cpp中给iostream包含#include指令,则每次编译程序时,都重新编译它。如果把它放在stdafx.h中,iostream就只编译一次。因此,stdafx.h应包含不常修改的所有头文件的#include指令。这包括项目的标准头文件和很少修改的所有自定义项目头文件。在学习C++时,不会使用出现在stdafx.h中的这两种头文件。
  2. Main函数名
  如前所述,在编写使用Unicode字符的程序时,Visual C++支持wmain()作为main()的替代函数, wmain()是main()的Microsoft特有定义,不是标准C++的一部分。tchar.h头文件定义了名称_tmain,它一般由main取代,但是如果定义了符号_UNICODE,它就由wmain取代。为了把程序标识为使用Unicode,需要在stdafx.h头文件的开始处添加下列语句:
  #define _UNICODE
  #define UNICODE
  为什么需要两个语句?定义符号_UNICODE,会让Windows头文件假定,Unicode字符是默认的。定义_UNICODE会给C++标准库附带的C例程头文件带来相同的效果。Ex2_01A项目并不需要这么做,因为Character Set项目属性默认设置为使用Unicode字符。前面详细解释了main()函数,C++控制台示例坚持使用普通但成熟的main()函数,它是标准C++函数,因此是可移植性最好的编码方法。
  2.2 定义变量
  在所有的计算机程序中,一个基本的目标是操作数据,获得结果。这个过程中的一个基本元素是获得一段内存,可以称其为自己的内存,使用一个有意义的名称引用它,并在其中存储一条数据。所指定的每段内存都称为一个变量。
  我们知道,每种变量都存储一种特定的数据,在定义了变量后,它可以存储的数据类型就是固定的。储整数的变量,就不能存储小数。变量在某一时刻包含的值由程序中的语句确定,随着程序计算的进展,它的值通常多次改变。
  2.2.1 命名变量
  变量的名称(其实是C++中所有事物的名称)可以是任意字母和数字的序列,其中下划线_算作字母,其他字符则不允许使用,如果在名称中使用了一些其他字符,编译程序时就会得到一个错误消息。名称必须以字母或下划线开头,通常表明所存储的信息的种类。名称也称为标识符。
  在Visual C++中,变量名最长可以有2048个字符,因此给变量命名有相当大的灵活性。如果使用长名称会使程序难以阅读,除非键盘技巧很高,否则长名称很难输入。更严重的问题是,并非所有编译器都支持这么长的名称。事实上,很少需要使用10或15个字符以上的名称。
  最好避免使用以下划线开头、且包含大写字母的名称,如_Upper和_Lower,因为它们可能与相同形式的标准库名称发生冲突。由于同样的原因,还应当避免使用以双下划线开头的名称。
  下面是一些有效的变量名:
  price discount pShape value_ COUNT
  five NaCl sodiumChloride tax_rate
  涉及两个或多个单词的有意义的名称可以用各种方式构建:第二个单词和以后各单词的首字母大写,或者在各单词之间插入下划线。前面列表里有一些示例。本书的代码中给名称使用各种样式,但最好在一个程序中只使用一种样式。
  8_Ball、7Up和6_pack不是合法的名称。Hash!或Mary-Ann也不是合法的名称。最后这个示例是一个很常见的错误,但带有下划线的Mary_Ann是合法的。当然,Mary Ann不是合法的名称,因为变量名不允许有空白。名称republican和Republican是不同的,因为名称是区分大小写的。一个常见的约定是类名以大写字母开头,变量名以小写字母开头,参见第8章。
  ……

前言/序言

  欢迎使用本书。通过学习本书,你可以使用Microsoft公司最新的应用程序开发系统Visual Studio 2013,成为优秀的C++程序员。本书旨在讲述C++程序设计语言,然后讲述如何运用C++语言开发自己的Windows应用程序。在此过程中,读者将了解这一最新Visual C++版本所提供的很多激动人心的新功能。
  Visual C++ 2013是Microsoft开发环境Visual Studio Professional 2013的所有版本的一部分,本书提到Visual C++时,都是指Visual Studio Professional 2013包含的Visual C++ 2013功能。注意Visual Studio Express 2013版本没有提供本书的全部功能。第11到18章的示例不能用Visual Studio Express 2013创建。
  0.1 本书读者对象
  本书针对任何想要学习如何使用Visual C++编写在Microsoft Windows操作系统下运行的C++应用程序的读者。阅读本书不需要预先具备任何特定编程语言的知识。如果属于下列3种情形之一,你就适合学习本教程:
  ●  属于编程新手,十分渴望投入编程世界,并最终掌握C++。要取得成功,你至少需要对计算机的工作原理有大体的理解。
  ●  具备一些其他语言的编程经验,如BASIC;渴望学习C++,并想提升实际的Microsoft Windows编程技能。
  ●  有一些使用C语言或C++语言的经验,但使用环境不是Microsoft Windows;希望使用最新的工具和技术,扩展在Windows环境下编程的技能。
  0.2 本书主要内容
  本书的第一部分通过一个详细的循序渐进式教程,讲授了使用Visual Studio Professional 2013编写C++程序的基础知识。你将了解C++语言的语法和用法,并通过有效的示例,获得实际运用它的经验和信心,示例代码演示了C++的几乎所有方面。本书也提供了一些练习,可以检验所学的知识,并且可以下载练习题答案。
  本语言教程也介绍和说明了C++标准库功能的用法,因为开发程序时极有可能使用它们。随着深入地学习C++语言,你的标准库知识会不断增加。还将学习标准模板库(Standard Template Library,STL)提供的强大工具。
  对C++的运用有信心之后,就可以继续学习Windows编程了。通过创建超过2000行代码的大型可运行的应用程序,学习如何使用MFC来开发Windows桌面应用程序。开发此应用程序贯穿多章内容,用到了MFC提供的一系列用户界面功能。还要学习如何编写面向平板电脑、运行Windows 8的应用程序,通过循序渐进地开发一个有效的游戏示例,来学习如何创建带有Windows 8现代界面的应用程序。
  0.3 本书结构
  本书内容的结构安排如下:
  ●  第1章介绍使用C++编写程序所需要理解的基本概念,以及在Visual C++开发环境中体现的主要思想,还叙述了如何使用Visual C++的功能来创建本书其余部分要学习的各种C++应用程序。
  ●  第2~9章讲授C++语言。首先是简单的过程式程序示例,然后学习类和面向对象的编程。
  ●  第10章介绍如何使用标准模板库(Standard Template Library,STL)。STL是一组功能强大且全面的工具,用来组织和操作C++程序中的数据。由于STL是独立于应用程序的,因此可以在上下文中大量应用它。
  ●  第11章讨论Microsoft Windows桌面应用程序的组织方式,并描述和展示了在所有为Windows操作系统编写的桌面应用程序中都存在的基本元素。本章通过基础示例解释了Windows应用程序的工作原理,还将创建使用C++语言、Windows API和MFC的程序。
  ●  第12~17章讲述Windows桌面应用程序的编程。详细描述了如何使用MFC提供的构建GUI的功能编写C++ Windows应用程序。我们将学习如何创建并使用通用控件来构建应用程序的图形用户界面,还将学习如何处理因用户与程序的交互作用而产生的事件。除了学习构建GUI的技术以外,还将从开发该应用程序的过程中学到如何打印文档,以及应用程序如何处理文件。
  ●  第18章讲述为Windows 8编写应用程序的基本概念,开发一个使用Windows 8现代用户界面的完整、有效的应用程序。
  本书各章内容都包括许多工作示例,通过这些示例阐明所讨论的编程技术。每章结束时都总结了该章所讲述的要点,大多数章节都在最后给出了一组练习,可以应用所学的技术来试着解答这些练习。练习的答案连同书中的所有代码都可以从Wrox出版社的网站上下载。
  0.4 使用本书的前提
  Visual Studio 2013有几个版本,它们都有不同的功能。本书假定你安装了Visual Studio Professional 2013(或更高版本)。换言之,只要安装付费的Visual Studio 2013版本即可。如果你是全日制学生,则可以使用低成本的学生版本。只安装免费的Express版本是不够的。
  如果安装了Visual Studio和Windows 7或Windows 8,就可以使用第1~17章的使用示例和练习,要使用第18章的示例,Visual Studio的版本必须安装在Windows 8环境下。
  第2~10章的示例可以使用Windows桌面的Visual Studio Express 2013创建和执行,但第11~18章的示例不行。
  0.5 源代码
  读者在阅读本书提供的代码时,既可以亲自输入所有代码,也可以使用随书提供的代码文件。本书所有代码均可以从http://www.wrox.com/或http://www.tupwk.com.cn/downpage网站下载。进入该网站后,读者可以根据本书的书名查找本书(既可以使用搜索框,也可以使用书名列表进行查找),然后单击本书详细内容页面上提供的Download Code链接,就可以下载本书提供的所有代码。
  注意:
  由于许多书籍名称与本书类似,读者也可以通过ISBN进行查找,本书的ISBN为:978-1-118-84571-4。
  另外,读者可以从前面提到的CodePlex网站下载本书或其他Wrox书籍的代码,也可以从Wrox的代码下载页面http://www.wrox.com/dynamic/books/download.aspx和http://www. tupwk.com.cn/downpage下载本书或其他Wrox书籍的代码。
  0.6 练习
  许多章节都有一组练习用于检验你所学的知识。尽量完成所有的练习。如果有问题,可以从http://www.wrox.com/go/beginingvisualc上下载练习题的答案。
  0.7 勘误表
  为了避免本书文字和代码中存在错误,我们已经竭尽全力。然而,世界上并不存在完美无缺的事物,所以本书可能仍然存在错误。如果读者在我们编写的某本书籍中发现了诸如拼写错误或代码缺陷等问题,那么请告诉我们,我们对此表示感谢。利用勘误表反馈错误信息,可以为其他读者节省大量时间,同时,我们也能够受益于读者的帮助,这样有助于我们编写出质量更高的专业著作。
  如果读者需要参考本书的勘误表,请在网站http://www.wrox.com中用搜索框或书名列表查找本书书名。然后,在本书的详细内容页面上,单击Book Errata链接。在随后显示的页面中,读者可以看到与本书相关的所有勘误信息,这些信息是由读者提交、并由Wrox的编辑们加上的。通过访问http://www.wrox.com/misc-pages/booklist.shtml,读者还可以看到Wrox出版的所有书籍的勘误表。
  如果读者没有在Book Errata页面上找到自己发现的错误,那么请转到页面http://www. wrox.com/contact/techsupport.shtml,针对你所发现的每一项错误填写表格,并将表格发给我们,我们将对表格内容进行认真审查,如果确实是我们书中的错误,我们将在该书的Book Errata页面上标明该错误信息,并在该书的后续版本中改正。
  0.8 关于p2p.wrox.com论坛
  如果读者希望能够与作者进行讨论,或希望能够参与到读者的共同讨论中,那么请加入p2p.wrox.com论坛。该论坛是一个基于Web的系统,读者可以在论坛发表与Wrox出版的书籍及相关技术的信息,并与其他读者和技术用户进行讨论。论坛提供了订阅功能,可以将与读者所选定主题相关的新帖子定期发送到读者的电子邮箱。Wrox的作者、编辑、业界专家,以及其他读者都会参与论坛中的讨论。
  读者可以在http://p2p.wrox.com参与多个论坛的讨论,这些论坛不仅能够帮助读者更好地理解本书,还有助于读者更好地开发应用程序。如果读者希望加入论坛,那么请按照以下步骤执行:
  (1) 进入http://p2p.wrox.com页面,单击Register链接。
  (2) 阅读使用条款,然后单击Agree按钮。
  (3) 填写必要的信息及可选信息,然后单击Submit按钮。
  (4) 随后读者会收到一封电子邮件,邮件中说明了如何验证账户并完成整个加入过程。
  读者无须加入P2P论坛即可阅读论坛消息,但如果需要发表主题或发表回复,那么必须加入论坛。
  成功加入论坛后,读者就可以发表新主题了。此时,读者还可以回复其他用户发表的主题。读者在任何时间都可以阅读论坛信息,如果需要论坛将新的信息发送到自己的电子邮箱,那么可以单击论坛列表中论坛名称旁的Subscribe to this Forum图标完成这项功能设置。
  如果读者需要获得更多与Wrox P2P相关的信息,请阅读P2P FAQs,这样可以获得大量与P2P和Wrox出版的书籍相关的具体信息。阅读FAQs时,请单击P2P页面上的FAQs链接。

开启您的C++编程之旅:深入理解Visual C++ 2013的核心与实践 无论您是初次接触编程,还是希望将您的技能提升到新的水平,掌握一门功能强大且应用广泛的编程语言都是至关重要的。C++以其卓越的性能、灵活的抽象能力以及在操作系统、游戏开发、嵌入式系统等众多领域的广泛应用,成为当今软件开发领域不可或缺的基石。而Visual C++ 2013,作为Microsoft强大的集成开发环境(IDE)的最新版本,为开发者提供了一个全面而高效的平台,用以构建复杂而 robust 的应用程序。 本书旨在为您提供一条清晰、系统且极具实践性的学习路径,帮助您从零开始,一步一个脚印地掌握Visual C++ 2013的精髓。我们将以一种循序渐进的方式,带领您深入探索C++语言的核心概念,同时紧密结合Visual C++ 2013 IDE的强大功能,让您在理论学习与实际编码之间找到完美的平衡。 核心概念的坚实基础:理解C++的脉搏 C++是一门多范式编程语言,它融合了过程式编程、面向对象编程以及泛型编程的强大特性。要真正掌握C++,理解其底层机制和设计理念至关重要。本书将从最基础的变量、数据类型、运算符和表达式入手,逐步引导您理解控制流语句(如if-else、while、for循环),这是编写任何程序的基础。 在此基础上,我们将深入探讨C++的面向对象编程(OOP) paradigm。您将学习到类(class)和对象的概念,理解封装(encapsulation)、继承(inheritance)和多态(polymorphism)这三大OOP支柱如何帮助您构建可重用、可维护且易于扩展的代码。我们将通过大量的示例,演示如何定义类,创建对象,并利用成员函数来操作对象的状态。继承的概念将被深入剖析,帮助您理解如何创建层次化的类结构,实现代码的复用。多态的力量,尤其是通过虚函数(virtual functions)和抽象类(abstract classes)的实现,将是本书重点讲解的内容,它将极大地提升您编写灵活且适应性强的代码的能力。 指针(pointers)和引用(references)是C++中最具挑战性但也最强大的特性之一。本书将用清晰易懂的方式解释它们的工作原理,以及它们在内存管理、动态数据结构和函数参数传递中的重要作用。您将学习如何安全有效地使用指针,避免常见的内存泄漏和访问越界等问题。 数组(arrays)和字符串(strings)是处理集合数据的基本工具。我们将详细介绍C++中数组的声明、初始化和访问方式,以及字符串的处理方法,包括C风格字符串和C++标准库中的`std::string`类。 函数(functions)是组织代码、实现模块化的关键。您将学习如何定义函数,参数传递(传值、传指针、传引用),返回值,以及函数重载(function overloading)和函数模板(function templates)等高级概念,它们将帮助您编写更具通用性和效率的代码。 STL(Standard Template Library)是C++中最宝贵的财富之一。本书将引导您探索STL的核心组件,包括各种容器(如vector、list、map、set)、迭代器(iterators)和算法(algorithms)。您将学会如何利用STL高效地管理数据,实现各种复杂的操作,而无需从头开始编写大量的底层代码。 Visual C++ 2013 IDE的全面实践:从编码到调试的无缝体验 仅仅理解C++语言本身是不够的,您还需要掌握如何使用强大的工具来将您的想法转化为实际可运行的程序。Visual C++ 2013 IDE提供了丰富的功能,能够极大地提高您的开发效率。 本书将带领您熟悉Visual C++ 2013 IDE的各个方面,包括: 项目创建与管理: 从创建新的控制台应用程序、Windows桌面应用程序到更复杂的项目类型,您将了解如何有效地组织和管理您的项目文件。 代码编辑器: 探索Visual C++ 2013的代码编辑器,包括语法高亮、智能感知(IntelliSense)、代码片段(code snippets)等功能,它们将帮助您更快、更准确地编写代码。 调试工具: 调试是软件开发过程中不可或缺的一环。我们将深入讲解Visual C++ 2013强大的调试器,包括如何设置断点(breakpoints)、单步执行代码(step over, step into, step out)、查看变量值、监视表达式以及理解调用堆栈(call stack)。熟练掌握调试技巧将使您能够快速定位并修复代码中的错误。 资源编辑器: 对于Windows桌面应用程序的开发,您将学习如何使用Visual C++ 2013内置的资源编辑器来设计用户界面元素,如菜单、对话框、图标等。 构建与发布: 理解编译(compiling)、链接(linking)和构建(building)过程,以及如何生成可执行文件和部署您的应用程序。 实践驱动的学习:从简单到复杂,步步为营 理论知识的学习需要通过实践来巩固和深化。本书的每一章都将包含大量的实用示例和练习,这些示例从简单到复杂,涵盖了C++语言和Visual C++ 2013 IDE的各个方面。 您将通过编写各种类型的程序来实践所学知识: 控制台应用程序: 从简单的“Hello, World!”程序开始,逐步构建能够进行数学计算、文本处理、文件操作的控制台应用程序。 Windows桌面应用程序: 学习如何使用MFC(Microsoft Foundation Classes)或C++/CLI来创建具有图形用户界面(GUI)的Windows应用程序,例如记事本、计算器等。您将学习如何处理用户输入、响应用户事件,以及创建标准的Windows控件。 简单的游戏开发: 探索使用C++和Visual C++ 2013进行一些基础的游戏开发技术,例如二维图形的绘制、简单的动画效果和用户交互。 数据结构与算法的实现: 通过实际编码来理解和实现链表、栈、队列、树等常见数据结构,以及排序、查找等基本算法。 面向未来的技能:构建现代软件 掌握Visual C++ 2013不仅意味着您能够编写功能性的程序,更意味着您为未来更复杂的软件开发打下了坚实的基础。C++及其相关技术在高性能计算、人工智能、嵌入式系统、游戏引擎、实时系统等前沿领域仍然扮演着至关重要的角色。通过本书的学习,您将具备理解和探索这些高级主题的能力。 本书的特色: 清晰易懂的语言: 我们采用清晰、简洁的语言,避免使用过于专业的术语,确保初学者能够轻松理解。 循序渐进的教学方法: 内容按照逻辑顺序组织,从基础到高级,层层递进,让学习过程更加顺畅。 丰富的实例驱动: 每个概念都伴随着精心设计的代码示例,让您能够立即看到学习成果。 强调实践操作: 大量动手练习题,鼓励您积极参与编码,将理论知识转化为实际技能。 深入IDE讲解: 全面介绍Visual C++ 2013 IDE的强大功能,帮助您提升开发效率。 本书是您开启Visual C++ 2013编程之旅的理想伙伴。无论您的目标是编写简单的实用工具,还是梦想成为一名杰出的软件工程师,本书都将为您提供坚实的基础和必要的工具。现在,让我们一起踏上这段令人兴奋的C++编程探索之旅吧!

用户评价

评分

作为一名想要深入学习 C++ 在 Windows 平台下开发的爱好者,我一直在寻找一本能够全面而系统地引导我的书籍。《Visual C++ 2013入门经典(第7版)》这本书,正如它的名字所暗示的那样,给予了我这样的信心。Ivor Horton 的著作,在我看来,就像是一位经验丰富的导师,能够将 C++ 的晦涩概念化繁为简。我非常期待书中能够对 Visual Studio 2013 这个集成开发环境进行详尽的介绍,包括它的各种工具和功能,以便我能够更高效地进行代码编写和项目管理。更重要的是,我希望书中能够详细讲解 MFC 库的使用,因为这是构建 Windows 应用程序的核心。从基本的控件操作到复杂的对话框设计,再到文件I/O和网络编程,我都希望能在这本书中找到清晰的指导。我已经预见了自己将会花费大量的时间去研读这本书,并且跟着书中的例子动手实践,我相信通过这种方式,我一定能够建立起扎实的 Visual C++ 编程基础,并且能够逐步独立地开发出一些具有实用价值的 Windows 应用程序。

评分

这本书的到手,让我对 Visual C++ 2013 的学习充满了期待。我之前学习 C++ 的过程中,一直觉得理论知识和实际应用之间存在一道鸿沟,特别是涉及到 Windows 应用程序的开发,更是感觉无从下手。Ivor Horton 的《入门经典》系列一直以其清晰的讲解和丰富的实例著称,所以我毫不犹豫地选择了这一版。我特别看重它对 C++ 核心概念的循序渐进的讲解,希望能通过这本书,将 C++ 的各种特性融会贯通,并且能够灵活运用到实际的开发中。书中提到的一些高级特性,比如模板、STL 和面向对象的设计模式,都是我一直想深入掌握的。我希望这本书能够提供详实的解释和大量的代码示例,帮助我理解这些复杂的技术。此外,这本书的结构安排也非常合理,从基础的语法到高级的应用,层层递进,不会让人感到突兀。我之前尝试过一些其他的 C++ 入门书籍,但总觉得内容不够系统,或者例子太过于简单,无法满足我进阶的需求。这本书的篇幅和内容深度,让我看到了希望。我已经迫不及待地想翻开它,开始我的学习之旅了。

评分

这本书,可以说是承载了我对 Visual C++ 2013 学习的全部希望。我之前在大学里学过一些 C++ 的基础,但感觉离实际开发还是有相当大的距离,尤其是在 Windows 平台上进行图形界面编程,更是让我感到迷茫。Ivor Horton 的这本《入门经典》系列,我关注了很久,一直听说它讲解得非常细致,而且实例丰富,对于初学者来说是极佳的选择。我特别想通过这本书,深入理解 MFC 这个强大的框架,它在 Windows 开发中的应用确实非常广泛。同时,我也期待书中能够详细讲解 C++ 的面向对象特性,以及如何在 Visual Studio 的集成开发环境中有效地进行代码编写、调试和项目管理。我希望这本书的讲解能够循序渐进,从最基础的“Hello, World!”开始,一步步引导我掌握更复杂的编程技巧,最终能够独立完成一些具有实际意义的 Windows 应用程序。这本书的厚度让我感到安心,我知道它里面一定蕴含着扎实的知识,能够支撑我长期的学习和探索。

评分

拿到这本《Visual C++ 2013入门经典(第7版)》,我首先被它厚实的篇幅和精美的装帧所吸引。我是一名正在准备进入 IT 行业,尤其对 Windows 桌面应用开发充满兴趣的在校生。一直以来,Visual C++ 都是我关注的焦点,但市面上相关的学习资源质量参差不齐,让我很难找到一本真正适合我的入门书籍。Ivor Horton 的大名我早有耳闻,他的《入门经典》系列在开发者圈子里有口皆碑。我非常看重这本书能够系统性地介绍 Visual C++ 的开发环境、基本语法以及核心的 MFC 框架。我希望通过这本书,能够让我快速上手,理解 Windows 程序是如何构建的,并且能够编写出功能完整的应用程序。书中包含的那些实际案例,是我最期待的部分,它们能够帮助我将理论知识转化为实践技能,真正意义上掌握 Visual C++ 的开发。我计划将这本书作为我的主要学习材料,每天抽出固定的时间进行研读和实践,争取在短时间内能够熟练运用 Visual C++ 进行开发,为我未来的学习和职业发展打下坚实的基础。

评分

终于入手了这本《Visual C++ 2013入门经典(第7版)》,冲着 Ivor Horton 的名头来的。之前接触过一些 C++ 的基础知识,但总感觉实践起来总是差那么一点意思,代码敲出来总不如自己想象的那么灵活。这本厚厚的书,光是翻阅一下目录,就感觉内容非常扎实,覆盖的知识点也很全面。我特别期待它在 MFC 和 .NET Framework 方面的内容,听说这块是这套书的强项,能把这些复杂的概念讲得清晰易懂,是我学习的重点。而且,封面设计也挺有质感的,拿在手里沉甸甸的,有种“大部头”的专业感,让人一看就知道是认真做学问的书。我之前在一些技术论坛上看到别人推荐这本书,都说它适合初学者入门,能打下坚实的基础。我希望这本书能够帮我理清 C++ 在 Windows 开发中的脉络,让我能真正掌握在 Visual Studio 中进行应用程序开发的技巧。我计划从头开始,跟着书中的例子一步步地实践,我相信通过这本书的学习,我一定能对 C++ 和 Visual C++ 有更深入的理解,并且能够独立开发出一些小型的 Windows 应用程序。这本书的排版和印刷质量也让我很满意,字体清晰,图示也比较直观,阅读起来不会觉得费眼睛。

评分

书不错,屯货,慢慢看,是正版的

评分

京东购物,质量好,速度快

评分

好好好好好好好好好好好好好好好好

评分

京东上买书还是比较靠谱的。

评分

很好的一本书,跟着书上的例子和练习一步一步来,打好cq语言的基础很简单。

评分

书很厚,字迹清晰。内容貌似有点复杂,就是不知道能不能看懂。慢慢学吧

评分

书不错,正好需要,准备开始阅读。

评分

还行还行还行还行还行还行还行还行还行还行还行还行还行还行还行还行还行还行还行还行还行

评分

很不错,我在大学的时候看了一半这书,现在想看完。这只是个兴趣?

相关图书

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.cndgn.com All Rights Reserved. 新城书站 版权所有