登入帳戶  | 訂單查詢  | 購物車/收銀台( 0 ) | 在線留言板  | 付款方式  | 聯絡我們  | 運費計算  | 幫助中心 |  加入書簽
會員登入 新註冊 | 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類閱讀雜誌 香港/國際用戶
最新/最熱/最齊全的簡體書網 品種:超過100萬種書,正品正价,放心網購,悭钱省心 送貨:速遞 / EMS,時效:出貨後2-3日

2024年03月出版新書

2024年02月出版新書

2024年01月出版新書

2023年12月出版新書

2023年11月出版新書

2023年10月出版新書

2023年09月出版新書

2023年08月出版新書

2023年07月出版新書

2023年06月出版新書

2023年05月出版新書

2023年04月出版新書

2023年03月出版新書

2023年02月出版新書

『簡體書』Visual C++/CLI从入门到精通

書城自編碼: 2562602
分類: 簡體書→大陸圖書→計算機/網絡程序設計
作者: [美]坦普曼[Templeman, J.]著,周靖译
國際書號(ISBN): 9787302397007
出版社: 清华大学出版社
出版日期: 2015-05-01
版次: 1 印次: 1
頁數/字數: 424/579000
書度/開本: 16开 釘裝: 平装

售價:NT$ 490

我要買

share:

** 我創建的書架 **
未登入.



新書推薦:
万有引力书系·基辅罗斯:东斯拉夫文明的起源
《 万有引力书系·基辅罗斯:东斯拉夫文明的起源 》

售價:NT$ 661.0
康熙的红票:全球化中的清朝
《 康熙的红票:全球化中的清朝 》

售價:NT$ 437.0
PyTorch语音识别实战
《 PyTorch语音识别实战 》

售價:NT$ 386.0
多卖三倍
《 多卖三倍 》

售價:NT$ 252.0
哲学思维:清晰思考的12条关键原则
《 哲学思维:清晰思考的12条关键原则 》

售價:NT$ 386.0
海盗之书
《 海盗之书 》

售價:NT$ 381.0
亲美与反美:战后日本的政治无意识
《 亲美与反美:战后日本的政治无意识 》

售價:NT$ 325.0
亲爱的安吉维拉:或一份包含15条建议的女性主义宣言
《 亲爱的安吉维拉:或一份包含15条建议的女性主义宣言 》

售價:NT$ 274.0

建議一齊購買:

+

NT$ 828
《 C++高级编程 第3版 》
+

NT$ 822
《 Visual C# 2013从入门到精通(微软技术丛书) 》
+

NT$ 801
《 C++游戏与图形编程基础(第2版) 》
+

NT$ 911
《 逐梦旅程:Windows游戏编程之从零开始 》
+

NT$ 284
《 别样诠释--一个Visual C++老鸟10年学习与开发心得 》
+

NT$ 656
《 C++图形与游戏编程基础 》
內容簡介:
全书共四部分24章,结构清晰叙述清楚,分别介绍和讨论了C++.NET基础与Microsoft.NET编程基础,阐述如何使用.NET Framework,解释了非托管代码,特性和反射,兼容COM等高级主题。
本书可帮助你提升专业技能,完全掌握Visual C++CLI语言。特别适合有一定编程经验但刚开始接触Visual C++的读者,可以高效指导读者由浅入深,循序渐进地掌握各种核心主题与技术。
目錄
第I部分 C++ .NET基础
第1章 Hello C++! 3
1.1 什么是C++CLI 3
1.2 第一个C++CLI应用程序 3
1.2.1 main函数 4
1.2.2 C++关键字和标识符 4
1.3 创建可执行应用程序理论 5
1.3.1 编辑应用程序源文件 5
1.3.2 编译源代码 5
1.3.3 运行并测试应用程序 6
1.4 创建可执行应用程序实践 6
1.4.1 创建项目 6
1.4.2 编辑C++源代码 7
1.4.3 生成可执行文件 8
1.4.4 执行应用程序 9
小结 9
快速参考 9
第2章 面向对象编程基础 10
2.1 什么是面向对象编程 10
2.2 面向对象编程语言的特点 11
2.2.1 封装 11
2.2.2 继承 11
2.2.3 多态 12
2.3 类和对象 12
2.4 开发生命周期的好处 13
2.5 一个简单的例子 13
快速参考 17
第3章 变量和操作符 18
3.1 什么是变量 18
3.2 基本数据类型 18
3.3 变量声明 19
变量命名 20
3.4 声明多个变量 20
3.5 变量赋值 20
3.6 句柄和指针 21
3.7 数组 22
3.8 常量 22
3.9 typedef 23
3.10 .NET Framework的String类 23
3.11 操作符和表达式 24
3.11.1 赋值操作符 24
3.11.2 算术操作符 24
3.11.3 关系和逻辑操作符 25
3.11.4 按位操作符 25
3.11.5 三元操作符 26
3.11.6 强制类型转换 26
3.11.7 操作符优先级和结合性 27
快速参考 28
第4章 使用函数 29
4.1 声明函数原型 29
4.1.1 声明简单函数原型 29
4.1.2 在函数原型中声明参数 30
4.1.3 在函数原型中声明返回类型 31
4.1.4 声明参数默认值 31
4.2 定义函数主体 32
4.2.1 定义简单函数主体 32
4.2.2 定义使用参数的函数主体 33
4.2.3 定义返回值的函数主体 34
4.3 调用函数 35
4.4 使用调试器单步执行 37
4.5 理解局部和全局作用域 40
快速参考 42
第5章 判断和循环语句 44
5.1 使用if语句进行判断 44
5.1.1 执行单路测试 44
5.1.2 执行双路测试 47
5.1.3 执行多路测试 48
5.1.4 执行嵌套测试 50
5.2 使用switch语句进行判断 51
5.2.1 定义简单switch语句 51
5.2.2 在switch语句中利用直通 53
5.3 执行循环 54
5.3.1 使用while循环 54
5.3.2 使用for循环 55
5.3.3 使用do-while循环 56
5.3.4 执行无条件跳转 58
快速参考 59
第6章 类和对象进阶 62
6.1 用头文件和源文件组织类 62
6.1.1 在头文件中声明类 64
6.1.2 在源文件中实现类 64
6.2 创建对象 66
6.3 用构造器初始化对象 68
6.3.1 定义构造器 68
6.3.2 成员初始化列表 69
6.4 定义类范围的成员 70
6.4.1 定义类级数据成员 71
6.4.2 定义类级成员函数 72
6.4.3 类构造器 74
6.5 在类中使用常量 75
6.5.1 使用类级常量 75
6.5.2 使用实例常量 76
6.6 定义对象关系 77
6.6.1 定义LoyaltyScheme类 77
6.6.2 实现LoyaltyScheme类 78
6.6.3 创建和使用LoyaltyScheme对象 79
6.6.4 测试应用程序 81
快速参考 82
第7章 控制对象生存期 85
7.1 .NET如何控制对象生存期 85
7.2 析构和终结 86
7.2.1 析构器 86
7.2.2 终结器 87
7.2.3 实现类的析构器和终结器 88
7.3 对象和栈的语义 91
7.3.1 传统C++对象的创建和析构 91
7.3.2 创建具有栈语义的对象 92
7.4 拷贝构造器 93
7.5 将对象和栈的语义关联 96
快速参考 99
第8章 继承 101
8.1 什么是继承 101
8.1.1 关于继承的术语 101
8.1.2 继承和代码重用 102
8.2 设计继承层次结构 102
8.3 定义基类 103
8.4 定义派生类 105
8.5 创建派生类的对象 107
8.6 具体和抽象类 108
8.7 重写成员函数 109
8.8 受保护的访问 113
8.9 定义密封类 114
8.10 定义和使用接口 115
快速参考 116
第II部分 Microsoft .NET编程基础
第9章 值类型 121
9.1 引用类型和值类型 121
9.1.1 对值类型的需求 121
9.1.2 值类型的特点 122
9.2 结构 123
9.2.1 创建和使用简单结构 123
9.2.2 深入理解结构 124
9.2.3 结构和类的区别、 125
9.2.4 为结构实现构造器 125
9.2.5 嵌套结构 126
9.2.6 复制结构 128
9.3 枚举 128
9.3.1 创建和使用枚举 129
9.3.2 在应用程序中使用枚举 131
9.3.3 高效使用内存 131
快速参考 132
第10章 操作符重载 133
10.1 什么是操作符重载 133
10.1.1 哪些类型需要重载操作符 133
10.1.2 哪些能重载 134
10.1.3 重载规则 134
10.2 在托管类型中重载操作符 135
10.2.1 重载算术操作符 135
10.2.2 使用静态操作符重载 136
10.2.3 可以重载哪些操作符 138
10.2.4 实现逻辑操作符 140
10.2.5 实现递增和递减 143
10.2.6 操作符和引用类型 144
10.2.7 操作符重载规范 145
快速参考 145
第11章 异常处理 146
11.1 什么是异常 146
11.1.1 异常的工作原理 147
11.1.2 不同的异常类型 148
11.2 抛出异常 148
11.3 处理异常 150
11.3.1 使用try和catch构造 150
11.3.2 自定义异常处理 152
11.3.3 使用异常层次结构 153
11.3.4 异常和构造器一起使用 153
11.3.5 异常嵌套和重新抛出 155
11.3.6 finally块 157
11.3.7 catch...块 157
11.4 创建自己的异常类型 158
11.5 使用safe_cast进行动态类型转换 160
11.6 跨语言使用异常 160
快速参考 163
第12章 数组和集合 165
12.1 原生C++数组 165
12.1.1 将数组传给函数 167
12.1.2 数组初始化 169
12.1.3 多维数组 169
12.1.4 动态创建数组 170
12.2 泛型类型 171
12.3 托管数组 172
12.3.1 初始化 174
12.3.2 数组和引用类型 174
12.3.3 对数组使用for
each循环 175
12.3.4 多维数组 176
12.4 .NET数组类 176
12.4.1 基本数组操作 178
12.4.2 更多高级数组操作 179
12.4.3 使用枚举器 181
12.5 其他.NET集合类 182
12.5.1 List类 183
12.5.2 SortedList类 185
12.6 泛型和模板 186
12.6.1 STLCLR库 187
12.6.2 STL的三个概念 188
快速参考 189
第13章 属性 190
13.1 什么是属性 190
13.2 实现标量属性 191
13.2.1 属性中的错误 193
13.2.2 自动实现的属性 193
13.2.3 只读和只写属性 194
13.2.4 属性、继承和接口 195
13.3 实现索引属性 196
13.3.1 Bank例子 196
13.3.2 创建Account类的属性 198
13.4 向Bank类添加账户 199
13.4.1 实现Add和Remove方法 199
13.4.2 实现索引属性来获取账户 201
快速参考 203
第14章 委托和事件 204
14.1 什么是委托 204
14.2 委托的作用 205
14.2.1 定义委托 205
14.2.2 使用委托 206
14.3 什么是事件 210
14.3.1 实现事件源类 211
14.3.2 实现事件接收者 213
14.3.3 综合运用 214
快速参考 218
第15章 .NET Framework类库 219
15.1 什么是.NET
Framework 219
15.1.1 公共语言运行时 219
15.1.2 Microsoft中间语言 220
15.1.3 通用类型系统 220
15.1.4 公共语言规范 220
15.1.5 .NET Framework类库 220
15.1.6 程序集 221
15.1.7 元数据 221
15.2 .NET Framework命名空间 223
15.2.1 在C++应用程序中使用命名空间 224
15.2.2 System命名空间 225
15.2.3 Collections命名空间 226
15.2.4 Collections接口 227
15.2.5 Diagnostics命名空间 227
15.2.6 IO命名空间 228
15.2.7 Windows命名空间 228
15.2.8 .Net命名空间 229
15.2.9 ServiceModel命名空间 229
15.2.10 Xml命名空间 229
15.2.11 Data命名空间 230
15.2.12 Web命名空间 230
快速参考 231
第III部分 使用.NET Framework
第16章 处理文件 235
16.1 System::IO命名空间 235
16.2 使用reader和writer进行文本IO 236
16.2.1 使用TextWriter
236
16.2.2 FileStream类 239
16.2.3 使用TextReader
240
16.3 处理文件和目录 242
16.4 二进制IO 249
16.4.1 BinaryWriter类 249
16.4.2 BinaryReader类 250
快速参考 254
第17章 读写XML 256
17.1 XML和.NET
256
17.1.1 .NET XML命名空间 256
17.1.2 XML处理类 257
17.2 用XmlReader解析XML 257
17.2.1 创建XmlReader
260
17.2.2 XmlReaderSettings类 260
17.2.3 验证良构XML
264
17.2.4 处理特性 264
17.2.5 解析XML时进行验证 265
17.3 用XmlTextWriter写XML 267
17.4 使用XmlDocument
271
17.4.1 什么是W3C
DOM 272
17.4.2 XmlDocument类 272
17.4.3 XmlNode类 274
快速参考 280
第18章 使用ADO.NET 281
18.1 什么是ADO.NET
281
18.1.1 ADO.NET数据提供程序 282
18.1.2 ADO.NET命名空间 282
18.1.3 ADO.NET程序集 283
18.2 创建连接式应用程序 283
18.2.1 连接数据库 284
18.2.2 创建和执行命令 286
18.2.3 执行数据修改命令 287
18.2.4 执行查询并解析结果 288
18.3 创建断开式应用程序 289
18.4 使用DataSet执行断开式操作 290
快速参考 295
第19章 用WCF编写服务 297
19.1 什么是Windows
Communication Foundation 297
19.1.1 分布式系统 297
19.1.2 服务 298
19.1.3 连接性 298
19.2 WCF基础 299
19.2.1 端点 299
19.2.2 地址 299
19.2.3 绑定 300
19.2.4 协定 301
19.2.5 消息交换模式 302
19.2.6 行为 303
19.3 创建服务 303
19.3.1 编写服务客户端 305
19.3.2 向服务添加元数据 306
19.3.3 使用代理访问服务 309
快速参考 311
第20章 Windows Store应用程序基础 312
20.1 Windows UI应用程序简史 312
20.1.1 Win32 API 312
20.1.2 MFC 313
20.1.3 Windows窗体 313
20.1.4 WPF 313
20.1.5 Windows 8和Windows Store 314
20.1.6 选择哪个UI库 314
20.2 Windows Store应用简介 315
20.3 写Windows
Store应用 317
20.3.1 创建第一个Windows
Store 应用 317
20.3.2 检查项目 320
20.4 XAML简介 321
20.4.1 什么是XAML
321
20.4.2 XAML语法 322
20.4.3 XAML控件 323
20.4.4 布局控件 324
20.4.5 事件处理 328
20.5 C++CX和Windows
RT 329
20.5.1 Windows RT 329
20.5.2 元数据 330
20.5.3 C++CX语法 330
20.5.4 常用命名空间 332
快速参考 334
第21章 Windows Store应用进阶 335
21.1 开发简单计算器 335
21.1.1 布局数字按钮 335
21.1.2 处理数字输入 338
21.1.3 添加数学运算 339
21.1.4 执行运算 342
21.1.5 测试计算器 345
21.1.6 改进图形 347
21.1.7 处理不同进制 349
21.1.8 使用应用栏 358
21.1.9 添加共享 361
21.1.10 改进思路 365
快速参考 365
第IV部分 高 级 主 题
第22章 使用非托管代码 369
22.1 托管和非托管代码 369
22.1.1 混合类 369
22.1.2 GCHandle类型 370
22.2 固定和装箱 372
22.2.1 内部指针 372
22.2.2 固定指针 372
22.2.3 装箱和拆箱 373
22.2.4 装箱 374
22.2.5 拆箱 374
22.3 使用PInvoke调用Win32 API中的函数 375
22.3.1 DllImportAttribute类 378
22.3.2 传递结构 379
快速参考 382
第23章 特性和反射 383
23.1 元数据和特性 383
23.2 使用预定义特性 385
23.2.1 AssemblyInfo.cpp文件 385
23.2.2 使用预定义特性类 386
23.3 定义自己的特性 389
23.3.1 特性类的属性 390
23.3.2 特性类设计规范 390
23.3.3 创建自定义特性 391
23.4 利用反射获取特性数据 394
23.4.1 Type类 394
23.4.2 访问标准特性 395
23.4.3 访问自定义特性数据 396
快速参考 398
第24章 兼容COM 400
24.1 COM组件和COM互操作 400
24.2 在.NET代码中使用COM组件 400
24.2.1 RCW的工作原理 401
24.2.2 创建和使用RCW
402
24.2.3 处理COM错误 404
24.2.4 COM对象晚期绑定 405
24.3 .NET组件作为COM组件使用 406
快速参考 408
译者后记 409
內容試閱
第I部分
C++ .NET基础
v 第1章 Hello
C++!
v 第2章 面向对象编程基础
v 第3章 变量和操作符
v 第4章 使用函数
v 第5章 判断和循环语句
v 第6章 类和对象进阶
v 第7章 控制对象生存期
v 第8章 继承

第1章 Hello C++!
本章学习目标
l 认识C++函数
l 认识C++关键字和标识符
l 创建C++应用程序
欢迎来到激动人心的Microsoft Visual C++编程世界。本章介绍C++CLI语言并展示如何执行简单的输入输出IO。
1.1 什么是C++CLI
C++CLI是C++和.NET Framework平台版本,从Microsoft Visual Studio 2005开始便已存在,已成为一项国际标准。ECMA标准请参考以下网址:
http:www.ecma-international.orgpublicationsstandardsEcma-372.htm
它对标准C++进行了一些修改。标准C++允许的一些操作在C++CLI中是不允许的例如不能从多个基类继承,并进行了一些修改以支持.NET功能例如接口和属性以及兼容.NET运行时。
C++CLI相较于其他.NET语言如C#有何优势?除了个人爱好,选择C++CLI还有两个很重要的理由。首先是互操作性,C++CLI简化了将标准C++代码集成到.NET项目的步骤。其次是现在有了C++标准模板库STL的.NET版本,熟悉STL编码的人很容易迁移到.NET。
即使对这两个理由都不“感冒”,C++CLI也是学习.NET编程的首选方式之一,因为它公开了写.NET程序和探索.NET平台所需的全部功能。
1.2 第一个C++CLI应用程序
先看看一个简单的C++CLI应用程序。现在没有“Hello
World”应用程序都不好意思说这是一本讲编程的书。所以先从这个程序开始:
using namespace System;
int main
{
Console::WriteLine"Hello,
World!";
return 0;
}
程序虽小,却演示了C++CLI 的基本概念。
l 第一行从using开始告诉编译器要使用.NET System库。项目中能使用许多不同的库;using语句的作用就是告诉编译器要使用什么库。
l 剩下的是一个C++函数。C++的所有代码块都称为“函数”,没有过程或子程序等。每个C++函数都包含函数头int main和函数主体大括号中的所有内容。函数头要列出函数的返回类型本例是int、函数名称main和圆括号中的参数列表。注意,即使无参也要加上圆括号。
l 所有C++语句都以分号结尾。
示例程序共6行,只有2行是C++语句,即函数主体中的2行。以Console开头的行向控制台输出字符,传给函数的是要输出的字符串。以return开头的行作用是退出函数,在本例中还退出了程序,因为退出main函数就相当于退出程序。返回值0是表明执行成功的标准值。
1.2.1 main函数
上例中,只有一个函数main。所有可执行程序都必须包含该函数。C++应用程序可能包含许多函数和许多类,第2章将详述。那么编译器怎么知道先调用哪个函数呢?显然不能让编译器随便挑选一个。答案是编译器总是查找main函数。没有,就会报错,无法创建可执行的应用程序。
自由格式的语言
C++是自由格式的语言。意味着编译器会忽略任何空格、回车符、换行符、制表符、分页符等。这些字符统称为空白字符。只有字符串中的空白字符才会被识别。自由格式的语言允许程序员灵活利用制表符或空格对代码进行缩进。例如,代码块中的语句比如for循环或if语句主体通常都要缩进一般2到4个空格。这使代码块的内容一目了然。C++社区经常争论大括号应该如何缩进。是和代码一起缩进,还是对齐if或for的开头。这个问题其实没有唯一正确的答案。只要风格统一,就能确保代码的可读性。毕竟对于编译器来说,整个应用程序写成一行都是可以的!排版的目的只是让程序员看着舒服。
编译器不仅会检查名为main的函数,还会检查返回类型和参数等内容。main可获取命令行参数,但不用命令行可省略这些参数。
1.2.2 C++关键字和标识符
C++关键字也称“保留字”是对编译器有意义的特殊单词。示例程序用到的关键字包括using,namespace和return。变量或函数名不允许使用关键字,否则编译器会报错。Visual Studio用特殊颜色区分关键字。
程序员用标识符表示变量和函数的名称。标识符必须以字母或下划线开头,而且只能包含字母、数字或下划线。以下C++标识符有效:
l My_variable
l AReallyLongName
下表所示的标识符无效。
无效标识符 无效原因
0800Number 不能以数字开头
You+Me 只能包含字母、数字和下划线
return 不能是保留字
只要不违反这些限制,任何标识符都合法。但不推荐使用下表所示的标识符。
标识符 不推荐的原因
main 和main函数混淆
INT 和保留字int混淆
B4ugotxtme 真心看不懂
_identifier1 虽然允许以下划线开头,但不推荐,因为编译器经常在创建内部变量名时添加下划线前缀,系统代码中的变量也是如此。使用下划线前缀可能会跟它们冲突
1.3 创建可执行应用程序理论
创建可执行应用程序要经历几个阶段。Microsoft Visual Studio能自动完成这些阶段,但仍有必要对它们有一个基本的了解。稍后生成第一个应用程序时,你会再次体验这些阶段。
1.3.1 编辑应用程序源文件
创建应用程序前,必须先把它写好。Visual Studio集成了C++编辑器,具有语法高亮显示和智能感知功能,能突出显示函数参数信息并提供单词自动完成功能。
1.3.2 编译源代码
C++CLI编译器将源代码转换成能由计算机处理器执行的东西。编译器获取源文件一般是.cpp扩展名,把它们转换为独立的可执行文件.exe扩展名或者能供其他项目使用的库文件.dll扩展名。
标准C++和C
如果你有标准C++或C的经验,就熟悉编译目标码并和库文件链接生成最终的可执行文件的过程。虽然一样是生成目标码在.NET中称为“模块”并用称为“程序集链接器”的工具把它们链接到一起,但Visual Studio自动隐藏了所有中间步骤,感觉源代码是被直接转换成为可执行文件。
1.3.3 运行并测试应用程序
成功生成应用程序后要运行并测试它。在许多开发环境中,运行和测试通常是最麻烦的环节,但Visual Studio在这方面做得很好。它提供了集成调试器,具备丰富的功能来帮助你进行运行时调试,比如设置断点和变量监视等。
1.4 创建可执行应用程序实践
启动Visual Studio后会显示起始页见下图。

这就是强大的Visual Studio集成开发环境Integrated
Development Environment,IDE,其中包含一整套工具来帮助你创建功能齐全的、易于使用的应用程序。
注意 本书中文版使用的是Visual
Studio 2013。使用其他版本看到的起始页不同。
1.4.1 创建项目
第一个任务是为“Hello, World”程序创建新项目。
1. 选择“文件”|“新建”|“项目”,或者按组合键Ctrl+Shift+N。
注意 在Visual
Studio Express中是选择“文件”|“新建项目”。
随后出现下图所示的“新建项目”对话框。

2. 在左侧导航窗格中,单击“模板”下的“Visual C++”,再单击“CLR”。在中间窗格中单击“CLR控制台应用程序”。在“名称”文本框中输入HelloWorld。
注意 取决于Visual
Studio的设置,“Visual C++”可能在“其他语言”下方。
3. 单击“位置”,输入或选择保存新项目的位置。可单击“浏览”查找合适的目录。
4. 单击“确定”按钮,创建项目。
向导随后将正确初始化控制台项目的所有编译器设置。
1.4.2 编辑C++源代码
向导创建项目,准备好一个简单控制台应用程序所需的全部文件。它还自动在编辑器中打开主项目文件,其中已包含了基本的代码见下图。
注意,关键字自动显示成蓝色只要拼写正确。自动生成的代码有一些是不需要的,所以将其删除能使代码更好理解,还能借此机会练习一下编辑器的用法。由于这个应用程序不准备接收任何命令行参数,所以删除main之后的圆括号中的全部内容,本例就是删除array ^args。另外,"Hello World"前的L不需要原因稍后解释,所以也把它删除。

1.4.3 生成可执行文件
下一步是生成可执行文件。在Visual Studio中,生成是指编译并链接应用程序的过程。Visual Studio编译自上次生成以来发生改变的任何源文件,未发现编译错误就执行链接。选择“生成”|“生成解决方案”或者按组合快捷键Ctrl+Shift+B来生成可执行文件。
Visual Studio窗口底部的“输出”窗格显示了生成过程。没有错误会显示“生成:成功1个,失败0个,最新0个,跳过0个”。如果没看到该窗格,请选择“视图”|“输出”。
发生任何问题,都会在“错误列表”窗格中显示错误和警告列表见下图。

双击错误即可将光标定位到源代码有错的那一行。改正错误可能是关键字拼写错误或者忘记添加分号并重新生成项目。如果没看到该窗格,选择“视图”|“错误列表”。
如何看待警告?
总是将警告视为错误。换言之,要把它们消除掉。警告说明代码有问题。
1.4.4 执行应用程序
消除了所有错误并成功生成项目后,就可以执行应用程序了。选择“调试”|“开始执行不调试”或者按快捷键Ctrl+F5来运行应用程序。
控制台窗口会显示应用程序的输出,底部显示提示信息“按任意键继续”。IDE添加这条消息是方便你看结果。否则应用程序会直接结束,控制台窗口稍纵即逝。
小 结
虽然本章的例子很简单,但仍然演示了C++开发的一些重点。本章介绍了Visual Studio IDE,说明了它编译和链接应用程序的功能,并简单介绍了C++CLI语言。
现在没有任何回头路了。每当学会一项C++CLI和Visual
Studio的新功能,都将引发你想要掌握更多的激情。在编程的道路上,你会变得越来能干。
但也不要忘了“找乐子”。回头修改一下示例程序,点击几个菜单,多花一些时间好好熟悉一下开发环境吧。
快 速 参 考
目标 操作
新建项目 选择“文件”|“新建”|“项目”,或者按快捷键Ctrl+Shift+N。Express版是选择“文件”|“新建项目”
向项目添加文件 选择“文件”|“新建”|“文件”,或者按快捷键Ctrl+N
生成项目 选择“生成”|“生成解决方案”,或者按快捷键Ctrl+Shift+B
从Visual Studio中执行程序 选择“调试”|“开始执行不调试”或者按快捷键Ctrl+F5

第2章 面向对象编程基础
本章学习目标
l 理解面向对象编程的关键概念
l 理解C++语言构造如何支持这些概念
l 理解面向对象编程开发的主要优势
l 创建和使用简单的类
2.1 什么是面向对象编程
面向对象编程是以自然方式开发多种系统的一种思维模式。世界由桌子、椅子、电脑、汽车、银行账号、足球比赛等对象物件构成。人自然而然地分类并归纳出它们的共性。例如,狗和猫是哺乳动物,面包机和冰箱是电器,游戏和网球是运动,丰田车和福特车是轿车,卡车和轿车是车辆,等等。
可通过多种方式对世界上的对象物件进行分类。具体如何分类,很大程度上取决于人们想如何使用它们,以及它们本身的功用。例如,经销商和普通用户对家用电器的分类法肯定是不同的,前者更细致。分类时,不同的人对一些属性的侧重也不同。例如,对于工程师,车子的颜色无关紧要,但法拉利的销售人员就很看重这个。
我们通过面向对象编程建立对象的层次结构,创建它们,并定义相互之间的关系。20世纪60年代,研究人员发现许多计算机程序建模的实体都可以命名,而且属性和行为都可以描述。例子包括银行账户、数组、文件和用户。所有这些都是对真实世界中的对象物件的模拟。
简单地总结一下面向对象编程,首先是识别问题要涉及到的对象,用层次结构组织对象,为对象添加数据来描述问题的上下文,以及为对象添加函数方法来执行所需的任务。细节也许有点多,但过程是一目了然的。
不过,简单并不意味着容易。一组对象可能以多种方式分类。要懂得识别对象的重要属性,还要进行良好的抽象并建立恰当的层次结构。即使是在具体的问题上下文中,有时也很难决定正确的抽象级别和恰当的层次结构。有的时候,就连决定一个对象应该从属于什么类别或组别都显得很困难。就像奥地利哲学家路德维希维特根斯坦在其1953年出版的《哲学研究》一书中指出的那样,有的东西在某个概念上的“家族相似性”就是要比其他东西强一些,例如,冰球和网球就是要比国际象棋和花样游泳更接近于“运动”。

2.2 面向对象编程语言的特点
前面说过,面向对象编程意味着定义和建立对象的层次结构,以及定义对象的属性和行为。任何编程语言都可以在某种程度上做到这一点,但使用支持面向编程方法的语言要容易得多。这就好比“条条大路通罗马”,但并非所有都是捷径。
C++和C#等面向对象编程语言具有3个重要特点:封装、继承和多态。它们支持以自然的方式识别和分类对象。下面分别详细说明。
2.2.1 封装
在软件开发人员面临的诸多问题中,有一个是自己开发的系统变得越来越庞大和复杂。通过封装,应用程序能分解成小的、自包容的实体,一切都将变得可控。例如,为了创建会计系统,可能需要代表账户和发票的对象。开发好Account账户类后,就不需要操心类的实现细节了。在应用程序的任何地方,都可以像使用内建类型比如int那样使用该类。类公开了Account对象的基本功能,同时隐藏了实现细节。
账户名称和余额是客户想知道的属性。至于账户名称如何存储是50字节的数组,还是字符串对象或者账户余额是否作来货币变量存储,这些都不是客户关心的。隐藏数据结构和实现细节的过程称为“封装”也称为“数据隐藏”,它阻止其他对象访问它们无需知道的细节。封装使大程序更容易理解,而且使其更健壮。
对象只能通过公开的属性和方法与其他对象交互。公开的属性和方法越多,修改类时要想不影响使用类的代码就越难。如果操作得当,类的内部工作机制修改之后,正在使用“类的对象”实例的代码可以不受丝毫影响。程序员只需关心类中的代码,不需要关心应用程序中实例化对象的所有地方。
2.2.2 继承
人们喜欢将事物划分成三六九等,这在程序员的眼里是合理的,包括C++在内的面向对象语言通过继承来支持这一概念。继承有两个好处。第一也是最重要的,它允许表达类型之间的“属于”is a关系。假定有两个类SavingsAccount和CheckingAccount,两者都派生自Account类。如果某个函数要求获取一个Account作为实参,那么可以向它传递一个SavingsAccount或者CheckingAccount,因为两个类都属于Account类型。Account是常规类型,而CheckingAccount和SavingsAccount是较具体的类型。第二个好处是类能继承高级类的功能。不用从头开发新类,新类可以继承现有类的功能,然后对功能进行修改或扩展。新类继承的父类称为“基类”,新类称为“派生类”。
为程序中的对象和类寻找合适的分类方式,这是开发人员的主要任务。例如,假定要开发一个驾驶游戏,合理的做法是开发一个常规的车辆类,把它作为其他具体车型类比如赛车或卡车的基类。这些派生类可添加新的属性和方法,或者重写现有方法,从而扩展或修改常规的车辆类。将小对象合并成大对象例如,一辆车由发动机和底盘构成,还使开发过程得到简化。每个对象都较简单,更容易设计和实现。
2.2.3 多态
面向对象编程的第3个特点是多态。这是很难定义的一个概念,所以让我们举例说明,更精确的定义就留给学究们吧。
多态意味着类可以用不同的方式实现相同的行为。以不同种类的车辆为例,它们都需要起动,在程序语言里说所有车辆都有“起动”功能。具体如何起动则要看车子。如果是福特T型车,就得跑到车前使用手摇起动柄,但现在的车只需转动点火钥匙。如果是蒸汽机车,起动会是一个困难和麻烦的过程。
再以之前提到的SavingsAccount和CheckingAccount类为例。从Account派生的所有类型都共享特定的功能,比如可以存款、取款和查询余额。这些功能可能要以不同方式实现,因为CheckingAccount可能允许透支,而SavingsAccount可能产生利息。但它们的用法是一样的。这意味着如果传递一个Account,账户具体是什么类型并不重要,都支持取款、存款和查询余额。这在编程时很有用,我们可以使用泛型的对象类型账户和车辆,不必关心类的功能具体怎样实现。
2.3 类 和 对 象
本章到目前为止一直是将“类”和“对象”不加区别地使用。但两者不是一回事,有必要进行一下澄清。从名字就可以看出,“面向对象编程”是围绕对象进行的。对象由描述对象的数据和可以在对象上执行的操作构成。但创建C++应用程序时,定义的是类而非对象。
类是用户自定义的类型,封装了数据和处理数据的方法 。除了静态函数,一般不能直接使用类。类就像模板,用于创建实例化对象。就像使用int变量前必须先声明一样,使用类的对象前必须先实例化。
例如,不是定义Animal对象,而是定义Animal类及其属性和方法。类代表概念,所以Animal不代表一种具体动物,而是代表所有动物。Animal对象要实例化之后才可使用。可认为类是实体的抽象表现,而类的实例对象是具体表现。

2.4 开发生命周期的好处
面向对象编程有三方面的好处:易理解、可重用和可扩展。用类来组织代码,不管程序规模有多大,都很容易理解。最理想的是利用预先写好的类来装配面向对象的系统,通过继承派生出新类,进行必要的修改以支持新的要求。其他现有的类作为构建单元使用,不需要进行任何更改。利用可重用组件来提高生产效率,这是面向对象编程最令人称道的一个好处。除此之外,面向对象编程还有助于获得高质量的系统。重用类意味着使用的是在之前的项目中测试通过的代码。所以,bug数量必然比从头开发的类少。随着时间的推移,任何可能存在的bug都会被“掀”出来并加以修正,而从头开发的代码还得经历同样的bug检测与修正过程。
面向对象编程的几个特点封装、继承和多态也带来了一些好处。封装方便了从小系统扩展成大系统。无论系统规模如何,开发人员只需创建对象。虽然大系统要求的对象比小系统多,但复杂性并未显著提高。继承改善了系统的灵活怀和扩展性,从而减少了维护成本。从现有类扩展新类,不仅能提供额外的功能,还能在不改变现有类的前提下对软件进行扩展。最后,数据隐藏造就了更安全的系统。对象的状态只能由它公开的方法来修改,这使对象的行为更容易预期。
2.5 一个简单的例子
下例演示如何创建类、实例化对象和访问成员函数数据。
1. 启动Microsoft Visual Studio。
2. 选择“文件”|“新建”|“项目”。
随后会打开“新建项目”对话框。
3. 在左侧窗格的“模板”下选择“Visual C++”,再选择“CLR”。
4. 在中间窗格选择“CLR控制台应用程序”。
5. 在“名称”文本框中输入Animals。
6. 在“位置”文本框为新项目选择位置单击“浏览”,好了之后单击“确定”按钮。
7. 编辑器中应该已经打开Animals.cpp。如果没有,在解决方案资源管理器的“源文件”文件夹中双击Animals.cpp。
8. 在using namespace System;这一行下方添加以下类定义:
ref class Animal
{
int legs;
String ^name;
};
在C++中声明类需要使用ref class关键字,后跟类名本例是Animal,然后在大括号中列出所有成员变量和函数。
Animal类包含代表腿数的int变量和代表名称的String变量。其他应用程序或类暂时访问不了这些变量。类的成员数据和方法默认私有,只能由类自己的方法访问。C++提供了3个访问修饰符public,private和protected来指定类成员的可见性。
9. 在起始大括号和第一个变量声明之间添加关键字public,后跟冒号:。
ref class Animal
{
public:
int legs:
String ^name;
};
关键字public后声明的是要公开的变量。但通常不方便让其他类或者应用程序中的其他部分访问类的变量。
前面的2.2.1节“封装”一节讲过,类的实现细节最好在类的用户面前隐藏,通过函数控制对类的数据的访问。下一步使用关键字private禁止直接访问类的String变量。legs变量还是公开,目的是演示能直接从main应用程序中访问它。
10. 在第一个int变量和第二个String变量之间添加关键字private和冒号::
ref class Animal
{
public:
int legs;

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 海外用户
megBook.com.tw
Copyright (C) 2013 - 2024 (香港)大書城有限公司 All Rights Reserved.