登入帳戶  | 訂單查詢  | 購物車/收銀台(0) | 在線留言板  | 付款方式  | 運費計算  | 聯絡我們  | 幫助中心 |  加入書簽
會員登入   新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類瀏覽雜誌 臺灣用戶
品種:超過100萬種各類書籍/音像和精品,正品正價,放心網購,悭钱省心 服務:香港台灣澳門海外 送貨:速遞郵局服務站

新書上架簡體書 繁體書
暢銷書架簡體書 繁體書
好書推介簡體書 繁體書

11月出版:大陸書 台灣書
十月出版:大陸書 台灣書
九月出版:大陸書 台灣書
八月出版:大陸書 台灣書
七月出版:大陸書 台灣書
六月出版:大陸書 台灣書
五月出版:大陸書 台灣書
四月出版:大陸書 台灣書
三月出版:大陸書 台灣書
二月出版:大陸書 台灣書
一月出版:大陸書 台灣書
12月出版:大陸書 台灣書
11月出版:大陸書 台灣書
十月出版:大陸書 台灣書
九月出版:大陸書 台灣書

『簡體書』现代C++探秘:编码、工程与科研必修(基于C++ 14)(英文版)

書城自編碼: 2979582
分類:簡體書→大陸圖書→計算機/網絡程序設計
作者: [德]Peter Gottschling[彼得·哥特史林]
國際書號(ISBN): 9787121308543
出版社: 电子工业出版社
出版日期: 2017-03-01
版次: 1 印次: 1
頁數/字數: 456/576000
書度/開本: 16开 釘裝: 平装

售價:HK$ 156.6

我要買

share:

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


新書推薦:
三神之战:罗马,波斯与阿拉伯帝国的崛起
《 三神之战:罗马,波斯与阿拉伯帝国的崛起 》

售價:HK$ 80.6
慢慢变富66招
《 慢慢变富66招 》

售價:HK$ 53.8
战国竹书复原综论
《 战国竹书复原综论 》

售價:HK$ 98.6
走出内心的深渊:快节奏人群心理疾病与健康指南(原书第3版)
《 走出内心的深渊:快节奏人群心理疾病与健康指南(原书第3版) 》

售價:HK$ 77.3
趋势跟踪: 汤姆·巴索的交易谋略
《 趋势跟踪: 汤姆·巴索的交易谋略 》

售價:HK$ 77.3
滚滚红尘(《滚滚红尘》电影原著)
《 滚滚红尘(《滚滚红尘》电影原著) 》

售價:HK$ 54.9
罗马之变(法语直译,再现罗马共和国走向罗马帝国的辉煌历史)
《 罗马之变(法语直译,再现罗马共和国走向罗马帝国的辉煌历史) 》

售價:HK$ 109.8
自然之争:1600年以来苏格兰和英格兰北部地区的环境史(新史学译丛)
《 自然之争:1600年以来苏格兰和英格兰北部地区的环境史(新史学译丛) 》

售價:HK$ 106.4

 

建議一齊購買:

+

HK$ 79.8
《编程风格:好代码的逻辑》
+

HK$ 243.6
《深度学习》
+

HK$ 114.6
《数学与泛型编程:高效编程的奥秘》
+

HK$ 71.1
《Lua设计与实现》
+

HK$ 100.1
《算法设计指南(第2版)》
+

HK$ 100.1
《多智能体机器学习:强化学习方法》
編輯推薦:
经典原味,基于C14,编码、工程与科研必修。
深入介绍,快速入门C,编写高质量、高性能软件。
本书作者为C标准委员会成员,拥有丰富的C教学经验。
內容簡介:
如今科学工程项目越来越大、越来越复杂,许多项目都采用C 编程语言来完成。本书深入介绍了基于C 编程语言高级功能的复杂方法,旨在帮助您快速入门,实现如表达式模板之类的高级技术。您还将学习如何使用C 编程语言的强大类库:标准模板库(STL)以及用于算法、线性代数、微分方程、图形的科学类库。书中演示了如何使用面向对象、泛型编程、元编程和过程技术来编写清晰明了、富有表达力的软件。当您学完本书,将掌握如何使用C 编程语言来编写高质量、高性能的软件。
關於作者:
Peter Gottschling 热衷于编写前沿的科学计算软件,他希望他的热情也能感染读者。因为职业的缘故他编写了 MTL4(矩阵模板库 4),同时也是 Boost Graph Library 的作者之一。他曾在多个 C 课程和专业培训中分享过开发经验,并撰写了本书。
他是 C 标准委员会成员,德国程序语言标准委员会副主席,也是德累斯顿 C 用户组的创始人。他年轻时在德累斯顿工业大学就读,同时在数学和计算机科学专业上达到了学士水平,并最终获得了计算机科学的博士学位。莱比锡建城一千年时,他离开了学术机构,回到了他*的故乡莱比锡,创建了自己的公司 SimuNova。
他已婚并育有四名子女。
目錄
Contents
Preface V
NNNN C V
Reasons to Read This Book VI
The Beauty and the Beast VI
Languages in Science and Engineering VIII
Typographical Conventions IX
Acknowledgments XI
About the Author XII
Chapter 1 C Basics 1
1.1 Our First Program 1
1.2 Variables 3
1.2.1 Constants 5
1.2.2 Literals 6
1.2.3 Non-narrowing Initialization 7
1.2.4 Scopes 8
1.3 Operators 10
1.3.1 Arithmetic Operators 11
1.3.2 Boolean Operators 14
1.3.3 Bitwise Operators 15
1.3.4 Assignment 15
1.3.5 Program Flow 16
1.3.6 Memory Handling 17
1.3.7 Access Operators 17
1.3.8 Type Handling 17
1.3.9 Error Handling 18
1.3.10 Overloading 18
xiii
前言
学习C 的理由
阅读本书的理由
美女与野兽
科学和工程领域的计算机语言
体例
致谢
关于作者
1.3.11 Operator Precedence 18
1.3.12 Avoid Side Effects! 18
1.4 Expressions and Statements 21
1.4.1 Expressions 21
1.4.2 Statements 21
1.4.3 Branching 22
1.4.4 Loops 24
1.4.5 goto 27
1.5 Functions 28
1.5.1 Arguments 28
1.5.2 Returning Results 30
1.5.3 Inlining 31
1.5.4 Overloading 31
1.5.5 main Function 33
1.6 Error Handling 34
1.6.1 Assertions 34
1.6.2 Exceptions 35
1.6.3 Static Assertions 40
1.7 IO 40
1.7.1 Standard Output 40
1.7.2 Standard Input 41
1.7.3 InputOutput with Files 41
1.7.4 Generic Stream Concept 42
1.7.5 Formatting 43
1.7.6 Dealing with IO Errors 44
1.8 Arrays, Pointers, and References 47
1.8.1 Arrays 47
1.8.2 Pointers 49
1.8.3 Smart Pointers 51
1.8.4 References 55
1.8.5 Comparison between Pointers and References 55
1.8.6 Do Not Refer to Outdated Data! 55
1.8.7 Containers for Arrays 56
1.9 Structuring Software Projects 58
1.9.1 Comments 59
1.9.2 Preprocessor Directives 60
1.10 Exercises 63
1.10.1 Age 63
1.10.2 Arrays and Pointers 64
1.10.3 Read the Header of a Matrix Market File 64
Chapter 2 Classes 65
2.1 Program for Universal Meaning Not for Technical Details 65
2.2 Members 67
2.2.1 Member Variables 67
2.2.2 Accessibility 68
2.2.3 Access Operators 70
2.2.4 The Static Declarator for Classes 70
2.2.5 Member Functions 71
2.3 Setting Values: Constructors and Assignments 72
2.3.1 Constructors 72
2.3.2 Assignment 81
2.3.3 Initializer Lists 82
2.3.4 Uniform Initialization 83
2.3.5 Move Semantics 85
2.4 Destructors 89
2.4.1 Implementation Rules 89
2.4.2 Dealing with Resources Properly 90
2.5 Method Generation Resume 95
2.6 Accessing Member Variables 96
2.6.1 Access Functions 96
2.6.2 Subscript Operator 97
2.6.3 Constant Member Functions 98
2.6.4 Reference-Qualified Members 99
2.7 Operator Overloading Design 100
2.7.1 Be Consistent! 101
2.7.2 Respect the Priority 101
2.7.3 Member or Free Function 102
2.8 Exercises 104
2.8.1 Polynomial 104
2.8.2 Move Assignment 104
2.8.3 Initializer List 105
2.8.4 Resource Rescue 105
Chapter 3 Generic Programming 107
3.1 Function Templates 107
3.1.1 Instantiation 108
3.1.2 Parameter Type Deduction 109
3.1.3 Dealing with Errors in Templates 113
3.1.4 Mixing Types 113
3.1.5 Uniform Initialization 115
3.1.6 Automatic return Type 115
3.2 Namespaces and Function Lookup 115
3.2.1 Namespaces 115
3.2.2 Argument-Dependent Lookup 118
3.2.3 Namespace Qualification or ADL 122
3.3 Class Templates 123
3.3.1 A Container Example 124
3.3.2 Designing Uniform Class and Function Interfaces 125
3.4 Type Deduction and Definition 131
3.4.1 Automatic Variable Type 131
3.4.2 Type of an Expression 132
3.4.3 decltypeauto 133
3.4.4 Defining Types 134
3.5 A Bit of Theory on Templates: Concepts 136
3.6 Template Specialization 136
3.6.1 Specializing a Class for One Type 137
3.6.2 Specializing and Overloading Functions 139
3.6.3 Partial Specialization 141
3.6.4 Partially Specializing Functions 142
3.7 Non-Type Parameters for Templates 144
3.8 Functors 146
3.8.1 Function-like Parameters 148
3.8.2 Composing Functors 149
3.8.3 Recursion 150
3.8.4 Generic Reduction 153
3.9 Lambda 154
3.9.1 Capture 155
3.9.2 Capture by Value 156
3.9.3 Capture by Reference 157
3.9.4 Generalized Capture 158
3.9.5 Generic Lambdas 159
3.10 Variadic Templates 159
3.11 Exercises 161
3.11.1 String Representation 161
3.11.2 String Representation of Tuples 161
3.11.3 Generic Stack 161
3.11.4 Iterator of a Vector 162
3.11.5 Odd Iterator 162
3.11.6 Odd Range 162
3.11.7 Stack of bool 162
3.11.8 Stack with Custom Size 163
3.11.9 Deducing Non-type Template Arguments 163
3.11.10Trapezoid Rule 163
3.11.11 Functor 164
3.11.12Lambda 164
3.11.13 Implement make_unique 164
Chapter 4 Libraries 165
4.1 Standard Template Library 165
4.1.1 Introductory Example 166
4.1.2 Iterators 166
4.1.3 Containers 171
4.1.4 Algorithms 179
4.1.5 Beyond Iterators 185
4.2 Numerics 186
4.2.1 Complex Numbers 186
4.2.2 Random Number Generators 189
4.3 Meta-programming 198
4.3.1 Limits 198
4.3.2 Type Traits 200
4.4 Utilities 202
4.4.1 Tuple 202
4.4.2 function 205
4.4.3 Reference Wrapper 207
4.5 The Time Is Now 209
4.6 Concurrency 211
4.7 Scientific Libraries Beyond the Standard 213
4.7.1 Other Arithmetics 214
4.7.2 Interval Arithmetic 214
4.7.3 Linear Algebra 214
4.7.4 Ordinary Differential Equations 215
4.7.5 Partial Differential Equations 215
4.7.6 Graph Algorithms 215
4.8 Exercises 215
4.8.1 Sorting by Magnitude 215
4.8.2 STL Container 216
4.8.3 Complex Numbers 216
Chapter 5 Meta-Programming 219
5.1 Let the Compiler Compute 219
5.1.1 Compile-Time Functions 219
5.1.2 Extended Compile-Time Functions 221
5.1.3 Primeness 223
5.1.4 How Constant Are Our Constants? 225
5.2 Providing and Using Type Information 226
5.2.1 Type Traits 226
5.2.2 Conditional Exception Handling 229
5.2.3 A const-Clean View Example 230
5.2.4 Standard Type Traits 237
5.2.5 Domain-Specific Type Properties 237
5.2.6 enable-if 239
5.2.7 Variadic Templates Revised 242
5.3 Expression Templates 245
5.3.1 Simple Operator Implementation 245
5.3.2 An Expression Template Class 248
5.3.3 Generic Expression Templates 251
5.4 Meta-Tuning: Write Your Own Compiler Optimization 253
5.4.1 Classical Fixed-Size Unrolling 254
5.4.2 Nested Unrolling 257
5.4.3 Dynamic Unrolling?CWarm-up 263
5.4.4 Unrolling Vector Expressions 265
5.4.5 Tuning an Expression Template 266
5.4.6 Tuning Reduction Operations 269
5.4.7 Tuning Nested Loops 276
5.4.8 Tuning Resume 282
5.5 Exercises 283
5.5.1 Type Traits 283
5.5.2 Fibonacci Sequence 283
5.5.3 Meta-Program for Greatest Common Divisor 283
5.5.4 Vector Expression Template 284
5.5.5 Meta-List 285
Chapter 6 Object-Oriented Programming 287
6.1 Basic Principles 287
6.1.1 Base and Derived Classes 288
6.1.2 Inheriting Constructors 291
6.1.3 Virtual Functions and Polymorphic Classes 292
6.1.4 Functors via Inheritance 297
6.2 Removing Redundancy 298
6.3 Multiple Inheritance 299
6.3.1 Multiple Parents 300
6.3.2 Common Grandparents 301
6.4 Dynamic Selection by Sub-typing 306
6.5 Conversion 308
6.5.1 Casting between Base and Derived Classes 309
6.5.2 const-Cast 313
6.5.3 Reinterpretation Cast 313
6.5.4 Function-Style Conversion 314
6.5.5 Implicit Conversions 315
6.6 CRTP 316
6.6.1 A Simple Example 316
6.6.2 A Reusable Access Operator 318
6.7 Exercises 320
6.7.1 Non-redundant Diamond Shape 320
6.7.2 Inheritance Vector Class 320
6.7.3 Clone Function 320
Chapter 7 Scientific Projects 321
7.1 Implementation of ODE Solvers 321
7.1.1 Ordinary Differential Equations 321
7.1.2 Runge-Kutta Algorithms 323
7.1.3 Generic Implementation 325
7.1.4 Outlook 331
7.2 Creating Projects 332
7.
內容試閱
前言
世界由C (以及它的C子集)构建。
Herb Sutter
Google、Amazon和Facebook的基础架构很多都由C构建。此外,相当一部分底层技术也是由C实现的。在电信领域,几乎所有固定电话和手机的连接都由C软件驱动。最重要的是,德国所有主要传输节点都是用C 处理的,这意味着笔者的家庭也依赖于C 软件。
即便是由其他语言撰写的软件也会依赖于C,因为最流行的编译器如Visual Studio、Clang、Gnu编译器包和Intel编译器都是用C实现的。Windows平台上的程序也多由C实现,如Microsoft Office套件。可以说C是无所不在的。甚至您的手机和汽车也会包含由C 开发的组件。C的发明者Bjarne Stroustrup制作了一个网页,列出了由C开发的应用清单,上文的例子也多源自于这个网页。
在科学和工程中,许多高质量的软件包都是用C实现的。当项目超过一定大小且数据结构非常复杂的情况下更能凸显C的强大能力。这也是为什么大量科学和工程模拟软件都 使用C的原因。随便举几个例子,比如该领域的领头羊Abaqus、deal.II、FEniCS以及OpenFOAM。知名CAD软件CATIA也由C开发。得益于更强大的处理器和改进的编译器, C在嵌入式系统上的应用也越来越多。当然,并不是所有的现代语言特性和库都可以用在这些平台上。
最后,如果一个项目可以重新开发,我们不知道有多少项目会使用C而不是C实现。例如,作者的好友Matt Knepley是非常成功的科学计算程序库PETSc的作者之一,如果可以重写这个库的话,他会选择C来实现它。
学习C的理由
和其他语言不同,从充分贴近硬件的开发,到高级抽象的开发,C几乎都能胜任。底层开发比如用户定制的内存管理(User defined memory management)可以让程序员了解程序执行过程中的细节,也能帮助您理解由其他语言开发的程序的行为。利用C可以编写执行效率非常高的程序,仅仅可能比使用机器语言编写的程序慢上一点点,但是后者要付出更多的努力。然而,在死磕性能调优之前(Hardcore Performance Tuning),您应该首先关注如何开发逻辑清晰、表达准确的程序。
而这正是C高层特性的用武之地。C直接支持多种编程范式(Programming Paradigms):面向对象编程(Object Oriented Programming)(第6章)、泛型编程(Generic Programming)(第3章)、元编程(Metaprogramming)(第5章)、并发编程(Concurrent Programming)(见4.6节)和过程化编程(Procedural Programming)(见1.5节),等等。C还发明了好几种编程技术,例如RAII(见2.4.2.1节)和表达式模板(Expression templates)(见5.3节)。C的表达能力如此之强,故而经常可以在不改变语言的情况下发明新的技术。也许有一天您也会发明一种新的技术呢。
阅读本书的理由
本书素材已经经过了多人的检验。作者执教课程C for Scientist已有三年,每年两个学期。这门课的学生多来自于数学系,也有一些来自于物理和工程专业。在课程学习之前,他们通常没有C基础,但在学完这门课程后就可以实现如表达式模板(见5.3节)之类的高级技术。您可以按照自己的节奏阅读本书:直接跟着本书路线完成学习,或者通过阅读附录A,了解更多示例和背景知识。
美女与野兽
编写C程序有多种方式,本书将循序渐进地指导读者使用更加高级的风格。这需要使用到C的高级特性。这些特性看起来挺吓人,但是习惯之后,它们不仅应用更加广泛,也更为高效且易读。
我们用下面这个例子作为您对C的第一印象:恒定步长的梯度下降法。原理非常简单,用其梯度函数例如gx来计算fx的最陡下降,并且用固定大小的步长追随这个梯度方向到相邻的局部最小值。 算法的伪代码也非常简单:
算法1:梯度下降算法
输入:初始值x,步长s,终止条件epsilon,函数f,梯度函数g
输出:局部最小值x
这个简单算法我们提供了两种实现。我们看一下下面代码并思考一下,不考虑它们的技术细节。
它们看起来非常相似,但我们会告诉您哪一个是我们喜欢的。第一个版本差不多是纯C语言,您可以用C编译器编译。这个版本的好处就是看起来很直观,使用double类型的2D函数。但是我们更喜欢第二个版本,因为它用途更广,具有任意值类型的任意维度函数。令人惊奇的是这个多功能的版本并没有降低效率。相反,函数F和G可以内联(见1.5.3节)节省了函数调用开销,而在左边版本中显式的(丑陋的)函数指针使得这种优化变得更困难。
如果您是一个有耐心的读者,就可以在附录A中(A.1)找个一个比较新旧样式的更详细的例子。附录中的案例更能体现使用现代风格编程的好处。当然,我们不希望您为这些新旧样式的小冲突折腾太久。
科学和工程领域的计算机语言
如果所有的数值类软件都在可以用C编写而不损失效率,那自然很好。但在我们找到一种既能高效计算,又不违反C类型系统的方法之前,还是用Fortran、汇编,或者针对体系结构优化过的方法更好。
Bjarne Stroustrup
科学计算和工程软件可以使用不同的编程语言编写,而哪种语言最合适则主要取决于我们的目标和可用的资源。
?当我们仅使用现有算法时,那么最好选择数学工具软件如MATLAB、Mathematica、R等。但如果希望在它们的基础上通过一些细粒度的运算(如标量计算)实现自己的算法,那么我们会发现它的性能将显著下降。当然如果问题本身很小,或者用户非常有耐心,这自然不是问题。否则,就需要寻找其他语言来实现我们的问题。
?Python非常适合快速开发。它也包含了大量科学计算的库,比如scipy和numpy。使用这些库(这些库本身通常由C或者C实现),我们也能开发出很高效的应用程序。和数学工具软件一样,细粒度实现的用户定义算法也会牺牲性能。如果要快速实现中小型任务,Python非常适合。但如果项目足够大,编译器的重要性就会逐渐体现出来(例如当参数不匹配时拒绝赋值)。
?Fortran也会适用于工程和科学计算,因为Fortran上拥有大量经过充分优化的操作,如密集矩阵运算。它非常适合完成那些老派教授的作业(这些作业本身很适合Fortran)。而依据作者的经验,在Fortran中引入新的数据结构非常麻烦,因此在Fortran中编写一个大规模的模拟程序是个相当大的挑战在今天,这样的选题只有少数人能勉为其难地接受。
?C语言有着很好的性能,用C编写的软件数量非常多。C的语言核心小,易于学习。使用C语言开发的挑战在于,需要使用简陋而危险的语言特性例如指针(见1.8.2节)和宏(见1.9.2.1节)去实现大型的、无Bug的软件。
?当应用程序的主要组件Web或图形界面组件没有特别密集的运算时,Java、C#、PHP这一类的语言是非常好的选择。
?开发大型、高质量、高性能的应用程序是C尤为擅长的。并且开发过程也不会十分漫长而痛苦。通过正确的抽象,可以飞快地编写C程序。在未来会有更多的科学计算库出现在C标准中。
显然,我们所了解的语言越多,选择的余地也就越大;对语言了解的越深入,我们做出的选择也越明智。此外,大型项目也常包含多个用不同语言开发的组件,多数情况下起码性能关键的内核部分都是由C或者C实现的。总而言之,学习C一定是一段有趣的过程,深入理解它,一定能帮助您成为一名出色的程序员。
体例
新术语使用斜体(italic)。C源代码使用等宽字符(monospace)。一些重要的细节被标记为粗体(boldface)。
类、函数、变量与常量一律使用小写字母,也可能会用到下划线。矩阵使用特殊的标记,我们一般使用单个大写字母来代表矩阵。模板参数和Concepts以大写开头,大写分割(CamelCase)。程序输出和命令行,使用打字机字体(typewriter font)。
如果程序需要C3、C11或者C14的特性,会用相应的边框来表示。一部分程序仅使用了少量C11的特性,且很容易替换成C3的实现,对于它们我们不再另行标注。
? directorysource_code.cpp。
除了一些特别短小的演示代码,所有编程实例都至少在一个编译器上测试过。在段落或小节的开头,我们会用箭头指示出所讨论的代码的路径。
所有程序都作为公有代码仓库置放在Github上:https:github.com petergottschlingdiscovering_modern_cpp。您可以使用以下命令来克隆代码仓库:
git clone https:github.competergottschlingdiscovering_modern_cpp.git。
在Windows上还可以使用更方便的工具TortoiseGit(tortoisegit.org)


致谢
按照时间顺序,我首先想感谢 Karl Meerbergen 和他的同事们。本书起始于我和 Karl在 KU Leuven 执教时所使用的 80 页讲义。随着时间的推移,其中多数段落已被重写,但是初始版本仍然是本书写作过程中的原动力。在 7.1 节 ODE解算器( Solver)实现的部分,我欠了 Mulansky一个大人情。
非常感谢 Jan Christiaan van Winkel 和 Fabio Fracassi,他们对手稿的每一个细节都进行了仔细检查,并在 C 标准的合规性和行文的可理解性上提出了许多建议。
特别感谢 Bjarne Stroustrup 在成书上所给予的策略上的提示,助我与 Addison-Wesley 建立联系,并且慷慨地允许我使用他已有的材料,以及 创造了 C。所有这些审校者都敦促我尽可能地使用 C11 和 C14 的特性来取代以前的讲稿内容。
此外,我还要感谢 Karsten Ahnert 的建议和 Markus Abel帮助我精炼原本冗长的前言。
当我为 4.2.2.6 节寻找一个有趣的随机数应用时, Jan Rudl 建议我可以使用他在课程教学中所使用的股价演变的案例。
感谢德累斯顿工业大学,让我得以在数学部门教授了三年多的 C,并且感谢我的学生们在课程中给予了我建设性的反馈。同样,非常感谢参与我的 C 培训的学员们。
十分感谢编辑 Greg Doench 在本书中接受我既严肃又轻松的风格,也感谢他长期与我讨论写作方案直到我们都满意为止。同时也感谢他提供的专业支持,没有他这本书永远不可能出版。
Elizabeth Ryan 负责管理全书的制作过程,同时耐心地满足了我所有的特殊要求。
最后,我衷心感谢我的家人 我的妻子 Yasmine,以及我的孩子 Yanis、Anissa、 Vincent 和 Daniel 你们为我牺牲了原本全家人共度的时光,令我可以将时间投入到本书的写作上。

 

 

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