【Swift 3 && C++11】<第一部分> 概览(1): Swift简单值与C++变量

Swift简单值与C++变量

| Swift | C++
:-:|:-:|:-:
关键字 | let / var | const auto / auto
作用 | 创建一个常量/变量 | 创建一个常量/** 变量**

关于数值

Swift 中使用 let 来创建常量,使用var来创建变量.

var myVariable = 42
myVariable = 50
let myConstant = 42

C++ 中可以使用 auto 创建变量, 使用const auto 创建常量(也可以用其他形式创建变量).

#include <iostream>

int main() {

    auto myVariable = 42;
    myVariable = 50;
    const auto myConstant = 42; 
    
    return 0;
}

const是 类型说明符, 用于说明后面那个东西是常量, 初次赋值之后就再也不能改变了.

你不需要指明常量或变量的类型, 在声明和同时赋值的话, 编译器可以自动推断类型.

上面例子中的 myVariablemyConstant

  1. Swift 将它们推断为Int类型.
  2. C++ 将它们推断为int类型.

一个常量或变量的值, 在编译期并不需要明确的值. 但是如果没有提供足够的信息(或者没有初始值), 那么你需要显式的指明类型.

Swift 中可以在变量或常量右面声明类型, 用冒号:分隔:

var varValue: Int
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70

C++中则需要先写类型名,再写变量名(创建常量/变量的另外的形式):

#include <iostream>

int main() {

    int varValue;
    const int constImplicitInt = 70;
    const double constImplicitDouble = 70.0;

    return 0;
}

Swift 练习: 创建一个常量,显式指定类型为 Float 并指定初始值为4。
C++ 练习: 创建一个常量,显式指定类型为 float 并指定初始值为4。

关于字符串

Swift 中的值永远不会被隐式转换为其他类型. 如果你需要把一个值转换为其他类型, 请显式转换:

let label = "The width is "
let width = 94
let widthLabel = label + String(width)

删除 String 试试看? 错误提示是什么?

** C++中**的值可以被隐式转换为其他类型, 但并不是所有类型的值都可以. 只有该类型支持隐式转换为其他类型, 才可以把该类型的值隐式转换为其他类型:

#include <iostream>
#include <string> // 创建一个字符串变量,需要先包含 string 头文件

int main() {

    int intValue = 70;
    double doubleValue = intValue;
    std::string aCplusplusString = "a C string"; // std::string 表示使用在标准库 std 中的 string 类型
    
    return 0;
}

std::string aCplusplusString = "a C string";
写成 std::string aCplusplusString = doubleValue; 试试?
错误提示是什么?

Swift 中有一种把值转换成字符串的更简单的方法: 把值写到括号中,然后在括号前写一个反斜杠. 形如: "字符串内容\(值)字符串其他内容"

let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."

** C++中**这种数值向字符串的转换是由标准库函数 to_string来完成的:

#include <iostream>
#include <string> // 创建一个字符串变量,需要先包含 string 头文件

int main() {

    int intValue = 70;
    double doubleValue = intValue;
    std::string aCplusplusString = "a C string"; // std::string 表示使用在标准库 std 中的 string 类型
    auto otherString = std::to_string(doubleValue); // std::to_string 表示使用在标准库 std 中的 to_string 函数
    auto otherString2 = std::to_string(doubleValue + intValue);
    
    return 0;
}

Swift练习:使用 \( )来把一个浮点数转换成字符串, 并加上某人的名字
C++练习:使用标准库中的 to_string 函数来把浮点数转换成字符串

关于数组与集合

** Swift 中**可以使用方括号[ ]来创建数组或字典, 并使用下标或者键来访问元素. 最后一个元素后面允许有逗号.

var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"

var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
 ] 
occupations["Jayne"] = "Public Relations"

// 创建空数组或字典,可以使用初始化语法.
let emptyArray = [String]()
let emptyDictionary = [String: Float]()

// 如果类型信息可以推断出来, 可以使用[]创建空数组,使用[:]创建空字典. 
// 当你为一个变量设置新值或者给一个函数传递参数的时候就可以这样做
shoppingList = []
occupations = [:]

** C++中**创建向量或关联数组, 则需要先指明类型名, 然后在<>中指定元素的类型, 再写变量名, 然后给变量初始化或赋值. 初始化或赋值时, 最后一个元素后面也允许有逗号. 只是没有Swift这么简洁了:

#include <iostream>

// 注意, 在 C++ 中, 下面这些东西统称为容器.
#include <string> // 包含 string 来创建C++字符串
#include <vector> // 包含 vector 来创建向量(类似数组), 另外也可以包含 array 来创建C++数组, 当然什么也不包含, 直接创建 C 数组
#include <map> // 包含 map 来创建有序的不重复关联数组. 另外也可以包含 unordered_map、 multimap、 unordered_map_multimap来分别创建无序的不重复的关联数组、有序的可重复的关联数组、 无序的可重复的关联数组

int main() {
    
    // 在创建的时候就不能使用 auto 进行类型推断了, 需要先指明类型, 再写变量名
    std::string aCArray[4] = {"catfish", "water", "tulips", "blue paint"}; // 创建 C 数组
    aCArray[1] = "bottle of water";

    // 创建 vector 需要在<>中指明 vector 中包含元素的类型
    std::vector<std::string> aVector = {"catfish", "water", "tulips", "blue paint"};
    aVector[1] = "bottle of water";
    
    // 创建 map 需要在<>中分别指明 map 键和值的类型
    std::map<std::string, std::string> aMap = {
        {"Malcolm", "Captain"},
        {"Kaylee", "Mechanic"},
    }; // std::map<std::string, std::string> 表示使用 std 标准库中的无序的关联数组, 其中键值的类型分别使用标准库 std 中的 string
    aMap["Jayne"] = "Public Relations";
    
    // 创建空向量/数组以及空字典
    std::vector<std::string> aEmptyArray;
    std::map<std::string, std::string> aEmptyMap;
    
    // 现在可以使用 auto 了
    auto aCArray2 = aCArray;
    auto aMap2 = aMap;
    
    
    return 0;
}

解释

  • 命名空间

    • C++中的命名空间是为了防止名字冲突, 给防止名字冲突提供了更加可控的机制.
      代码std::string, 其中 ::是作用域运算符, ::运算符把它的左右两边符号组合在一起, 表示使用在它的左边符号所代表的命名空间中(std), 找到的它的右边符号string; 也就是说std::string 表示使用存在在 std 中的 string
      如果::的左边什么都没有, 如::something 表示使用在全局作用域中的 something
    • Swift 中的命名空间是基于模块(module)的, 每个 module 代表了 Swift 中的一个命名空间, 而同一个命名空间中的名字仍然不能冲突. 简单的说一个项目,一个库就是一个命名空间, 而在一个项目(命名空间)中所用名字哪里都可以使用, 不需要 Import.
      另一种策略是使用类型嵌套的方法来指定访问的范围.
      详细请看>>王巍 (@ONEVCAT): 命名空间
  • C++代码中那些看起来巨长的类型名字

    • 现代 C++语言实际上是由三部分组成的:
      • 低级语言, 大部分继承自 C语言. 比如:可以创建 C 数组std::string aCArray[4] = {...};

      • 现代高级语言特性, 允许我们定义自己的类型以及组织大规模程序和系统.

      • 标准库, 它利用高级特性来提供有用的数据结构和算法.
        比如:vector, string, map 就是标准库提供的,所以如果没有任何说明的话, 就需要使用::运算符来使用来自标准库中内容(vector,string,map 等).
        而标准库的命名空间的名字为 std , 所以才出现像std::string,std::vector,std::map 这样的代码

  • 使用 using 声明等方法避免巨长的类型名字的书写.
    例如写入: using namespace std;后就可直接使用 string,vector, map 等名字了, 当然还有其他方法, 以后再详细介绍

    • 比如上面的代码可以修改为:

include <iostream>

// 注意, 在 C++ 中, 下面这些东西统称为容器.

include <string> // 包含 string 来创建字符串

include <vector> // 包含 vector 来创建向量(类似数组), 另外也可以包含 array 来创建C++数组, 当然也可以声明也不包含直接创建 C 数组, 其实 string 是一种字符数组

include <map> // 包含 map 来创建有序的不重复关联数组. 另外也可以包含 unordered_map、 multimap、 unordered_map_multimap来分别创建无序的不重复的关联数组、有序的可重复的关联数组、 无序的可重复的关联数组

using namespace std; // 表示在下面的代码中可以直接使用来自命名空间 std 中的所有名字
int main() {
// 在创建的时候就不能使用 auto 进行类型推断了, 需要先指明类型, 再写变量名
string aCArray[4] = {"catfish", "water", "tulips", "blue paint"}; // 创建 C 数组
aCArray[1] = "bottle of water";

      // 创建 vector 需要在<>中指明 vector 中包含元素的类型
      vector<string> aVector = {"catfish", "water", "tulips", "blue paint"};
      aVector[1] = "bottle of water";

      // 创建 map 需要在<>中分别指明 map 键和值的类型
      map<string, string> aMap = {
        {"Malcolm", "Captain"},
        {"Kaylee", "Mechanic"},
      }; // std::map<std::string, std::string> 表示使用 std 标准库中的无序的关联数组, 其中键值的类型分别使用标准库 std 中的 string
      aMap["Jayne"] = "Public Relations";

      // 创建空向量/数组以及空字典
      vector<string> aEmptyArray;
      map<string, string> aEmptyMap;

      // 现在可以使用 auto 了
      auto aCArray2 = aCArray;
      auto aMap2 = aMap;

      return 0;

}
```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,846评论 2 374
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,146评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,789评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,656评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,467评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,870评论 3 389
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,500评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,790评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,828评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,628评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,449评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,881评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,077评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,376评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,879评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,089评论 2 338

推荐阅读更多精彩内容