day_01_概述、名字空間、結構體、枚舉、字符串

===================================================================

推薦書籍:

  《C++程序設計與實現》Bjarne Stroustrup 本賈尼·斯特勞斯特盧普
  《C++ Primer》 可讀性不太好

C語言思想:把一個大的問題拆解成很多小的問題,然後逐一解決;
C++語言思想:先對問題整體有一個描述,再解決細節;

===================================================================

一、C++語言概述

1、歷史背景

1)C++江湖地位

java、C、C++、Python、C#

2)C++之父 Bjarne Stroustup(1950~)
  1979,Cpre,爲C語言增加類的機制;
  1983,發佈全新語言C with class,後來命名爲C++;
  1985,CFront1.0(C++編譯器),《The C++ programming Language》;
3)C++發展過程
  1987,GNU支持C++
  1990,Borland C++(BC)
  1992,Microsoft C++(VC)
  1998,ISO C++98
  2011,ISO C++11/C++0x(在0幾年草案已經公佈)

2、應用領域

  1)遊戲開發
  2)科學計算
  3)網絡通信(ACE - 網絡庫)
  4)操作系統和設備驅動
  5)其它(嵌入式、編譯器、腳本引擎…)

3、C和C++比較

  1)都是編譯型語言
  2)都是強類型語言,但是C++更強(強:int a = 100; 弱:a = 100;)
    C++類型檢查更加嚴格
  3)C++去除了C中不好特性(test.c)
  4)C++中增加很多號的特性(面向對象語法),比C語言更適合大型軟件開發;


二、第一個C++程序

1、編譯方式

  1)$ gcc xx.cpp -lstdc++
  2)$ g++ xx.cpp  g++自動鏈接標準C++庫

2、文件擴展名

  1)xx.cpp //推薦使用
  2)xx.cc
  3)xx.C
  4)xx.cxx

3、頭文件

  #include <iostream>
  #include <stdio.h> ==> #include <cstdio> (僅適用與標準C庫)

  頭文件位置:/usr/include/c++/

4、標準輸入和輸出

1)cin對象表示標準輸入 //類似scanf
eg:

int a;
scanf("%d", &a);
cin >> a;        //從標準輸入設備提取一個整形數放到變量a中;">>":提取運算符

eg:

int a;
double d;
//scanf("%d%lf", &a, &d);
cin >> a >> d;

2)cout對象表示標準輸出 //類似printf
eg:

int a = 100;
//printf("%d\n", a);  //把數據a插入到標準輸出設備; 
cout << a << endl;    //"<<":插入運算符

eg:

int a = 100;
int d = 3.14;
//printf("%d %lf\n", a, d);     //100 3.14
cout << a << " " << d << endl;  //100 3.14

三、名字空間(namespace)

1、名字空間的作用

  1)避免名字衝突
  2)劃分邏輯單元

2、定義名字空間

namespace 名字空間名{
    名字空間成員1;
    名字空間成員2;
    ...
}

eg:

namespace ns1{
    int x;          //全局變量
    void func(){}   //全局函數
    struct A{};     //自定義類型
    namespace ns2;  //名字空間
}

3、名字空間的使用

1)通過作用域限定符 “::”
  名字空間名::訪問的成員
eg:

int main(void)
{
    //訪問ns1名字空間中x變量
    x = 100;       //error,名字空間裏面成員不能直接訪問
    ns1::x = 100;  //ok
    func();        //error
    ns1::func();   //ok
}

eg:

/* std是標準C++庫中已經定義好的名字空間,稱爲標準名字空間,所有C++庫中全局函數、全局變量都在該名字空間中。 */
std::cout << "hello world" << std::endl;

2)名字空間指令
  using namespace 名字空間名;
  在該條指令以後的代碼中,指定名字空間中的成員都可見,訪問其中成員可以省略作用域限定。(相當於全局變量)
eg:

using namespace std;
int main(void){
    cout << "hello world!" << endl;
    return 0;
}

3)名字空間聲明
  using 名字空間名::名字空間成員;
  將名字空間中的特定成員引入當前作用域,在該作用域中訪問這個成員可以省略作用域限定。(相當於局部變量)
eg:

namespace ns{
    int i1;
    int i2;
}
int main(){
    using ns::i1;
    i1 = 100;      //ok
    i2 = 200;      //error
    ns::i2 = 200;  //ok
}

4、無名名字空間

不屬於任何名字空間的全局變量或函數,將被編譯器自動放入無名名字空間中。

eg:::無名名字空間成員;

5、名字空間的嵌套(瞭解)

namespace china{
    namespace beijing{
        char* name;
    }
    namespace chengdu{
        char* name;
    }
}
cout << china::beijing::name << endl;
cout << china::chengdu::name << endl;

四、C++的結構體、聯合體和枚舉

1、結構體

  1)定義結構體變量時,可以省略struct關鍵字;
  2)結構體中裏面可以定義函數,稱爲成員函數,在成員函數中可以訪問成員變量;

2、聯合體(瞭解) - - - - 節省內存空間

  1)定義聯合體變量時可以省略union關鍵字;
  2)支持匿名聯合;(只能在局部區使用,不能放在全局區)[本機測試編譯不通過]

07union.cpp:13:7: error: conversion from ‘int’ to non-scalar type ‘main()::<anonymous union>’ requested
  un = 0x12345678;
       ^~~~~~~~~~
07union.cpp:16:18: error: ‘uc’ was not declared in this scope printf("%#x ", uc[i]);

3、枚舉

  1)定義枚舉變量時,可以enum關鍵字;
  2)C++枚舉看做一種獨立數據類型,而C中枚舉本質就是整形數。
eg:

enum COLOR{RED, GREEN, BLUE};
COLOR c;
c = 100;  //c中ok,c++中error
c = RED;  //ok

五、字符串

1、回顧C中字符串

  1)雙引號常量字符串"hello world"
  2)字符串指針:char*
  3)字符數組:char arr[..];
eg:

char arr[] = "hello";
strcpy(arr, "xuyeqiang");  //內存越界,危險
char* p = "world";  //const char* p;(p指向的內容不能改變) char* const p;(p的指向不能改變)
strcpy(p, arr);     //段錯誤
p = "xuyeqiang";    //ok
arr = "xuyeqiang";  //error

2、C++兼容C中字符串,同時增加string類型,專門表示字符串

  1)定義字符串

#include <string>
string s;  //定義一個空字符串
string s = "hello";
string s = string("hello");  //和上面等價
string s("hello");           //和上面等價

cout << s << endl;  //cout可以直接輸出string類型的字符串

  2)字符串的基本操作

運算符 基本操作 演示
+ 或 += 字符串的連接 eg1
= 字符串的拷貝 eg2
< 或 <= 或 > 或 >= 字符串大小的比較 eg3
== 或 != 字符串是否相同
[] 獲取字符串中指定的字符 eg4

eg1:

string s1 = "hello";
string s2 = "world";
s1 += s2;            // s1 = s1 + s2
cout << s1 << endl;  // "helloworld"

eg2:

string s1 = "hello";
string s2 = "world";
s1 = s2;
cout << s1 << endl;  // "world"

eg3:

string s1 = "hello";
string s2 = "world";
if(s1>s2){
    cout << "s1 > s2" << endl;
}
else{
    cout << "s1 < s2" << endl;  //ok
}

eg4:

string s = "hello";
s[0] = 'H';

  3)string類型中常用的成員函數

size() / length()  //獲取字符串的長度
c_str();           //將string轉換爲char*風格的字符串
cin >> s;          //讀字符串,碰到空格、tab、回車則結束
getline(cin, s);   //可以讀走空格、tab,僅回車時結束
發佈了50 篇原創文章 · 獲贊 48 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章