? ? ? ? 我們學(xué)習(xí)了單鏈表啤呼、雙向鏈表等數(shù)據(jù)存儲結(jié)構(gòu)议薪。經(jīng)過這些天的揣摩,事實告訴我們媳友,如果不是應(yīng)對考試斯议,不管什么什么鏈表,我們都可以采用數(shù)形結(jié)合的思維學(xué)習(xí)醇锚,構(gòu)建表哼御,以及對表進行增刪改查等操作。由于焊唬,嵌入式開始不需要太深的C基礎(chǔ)恋昼,這里就不再一一贅述。今天起開始學(xué)習(xí)C++赶促。
? ? ? ? 啥是C++液肌?無疑是比C 的plus更plus。換句話說鸥滨,它完美繼承了C的精髓嗦哆,同時又有了自己的獨特魅力。
? ??????1)C++是C語言的擴充婿滓,是屬于半面向過程半面向?qū)ο蟮木幊陶Z言老速,C語言的所有語法,C++均支持
????????2)C語言是完全面向過程語言凸主,C#是完全面向?qū)ο笳Z言
????????3)C++既可以實現(xiàn)面向過程的程序設(shè)計橘券,也可以實現(xiàn)面向?qū)ο蟮某绦蛟O(shè)計
????????4)C語言適合于小型的軟件開發(fā),對于大型的軟件就顯得力不從心了卿吐,所以旁舰,為了彌補這一缺陷,引入了面向?qū)ο蟮拈_發(fā)設(shè)計
? ? ? ? 補充說明:
? ? ? ? 1)啥是面向?qū)ο笪斯伲芏鄷隙冀榻B得很清楚箭窜。但我個人感覺就是,把某一事物的屬性和行為等打包起谨湘,成為一個物事绽快。術(shù)語叫做類芥丧。就好比電視紧阔。我們把電視的屬性、行為等打包起來续担,形成電視機類擅耽。然后提供遙控器等接口來操控電視機。這就是所謂的面向?qū)ο?/p>
????????2)C++是對C語言的擴充
????????C語言中的所有語法物遇,C++均可直接使用
????????C語言的編譯器乖仇,是gcc憾儒,而C++的編譯器是g++,C++的編譯器比C語言的編譯器要求更加嚴格
? ? ? ? 例如:
????????#include <iostream>
????????#include<string.h>? ? ? ? ? ? ? ? //如果不加該頭文件,則第會報錯
????????using namespace std;
????????int main()
????????{
? ? ????????printf("%d\n", strlen("hello"));
? ? ????????return 0;
? ? ? ? ? ?}
????3)C++文件的后綴名為:.cpp? ? .C? ? .cxx? ? .cc? ? .hpp
????4)C++中的頭文件乃沙,一般不以.h結(jié)尾起趾,如果使用C語言中的頭文件,可以將.h去掉警儒,前面加個c
????????????#include===>#include
????5)linux下編譯C++文件:g++ 文件名.cpp -o? 可執(zhí)行文件
????6)C++中的類所在的頭文件名就是類名
一训裆、第一個C++程序
1.1 hello world
????#include <iostream> ?//其實就類似C語言的頭文件
????using namespace std; ?//使用系統(tǒng)提供的標準命名空間,系統(tǒng)提供的所有的名字都是來自于該空間內(nèi)
????int main()? ? ? ? ? //主函數(shù)入口
????{
? ? ? ? ? ?cout << "hello world" << endl;
? ? ????????//cout:輸出流對象蜀铲,是來自于ostream的類對象边琉,用于輸出操作,相當于printf
? ? ????????//<<:插入運算符记劝,用于輸出槽使用
? ? ????????//后面是輸出內(nèi)容变姨,使用該類對象輸出時,無需給定格式控制符
? ? ????????//endl:結(jié)束一行厌丑,表示換行
? ????? cout<<"大家好"<<520<<endl<<3.14<<'G'<<endl;
? ? ????return 0;
????}
1.2 輸出流對象cout
1定欧。 該對象是來自于ostream的類對象,功能上類似于printf函數(shù)
2怒竿。 該類對象本質(zhì)上調(diào)用成員函數(shù)插入運算符重載函數(shù)
3忧额。 輸出數(shù)據(jù)時,無需使用格式控制符:%d愧口、%c睦番、%s。耍属。托嚣。,直接輸出即可
4厚骗。 換行使用endl
#include <iostream>
using namespace std;
int main()
{
? ? //cout << "Hello World!" << endl;
? ? cout.operator<<(1234);? ? ? ? ? ? ? ? //相當于調(diào)用運算符重載函數(shù)
? ? cout<<520<<endl;? ? ? ? ? ? ? //輸出整數(shù)
? ? cout<<3.24<<endl;? ? ? ? ? ? ? //輸出小數(shù)
? ? cout<<"hello"<<endl;? ? ? ? ? //輸出字符串
? ? cout<<'H'<<endl;? ? ? ? ? ? ? ? //輸出字符數(shù)據(jù)
? ? char ch = 'G';? ? ? ? ? ? ? //定義字符數(shù)據(jù)
? ? char *p = "hello world";? ? ? //定義字符指針示启,指向字符串
? ? int num = 1314;? ? ? ? ? ? //定義整形數(shù)據(jù)
? ? cout<<&num<<endl;? ? ? ? ? ? //整形變量的地址
? ? //cout<<&ch<<endl;? ? ? ? ? ? ? //輸出一該字符作為起始地址的字符串
? ? cout<<p<<endl;? ? ? ? ? ? ? ? //輸出字符串
? ? cout.operator<<(&ch);? ? ? ? //輸出字符變量的地址
? ? return 0;
}
練習(xí):使用cout完成輸出斐波那契前20項的內(nèi)容
1 1 2 3 5 8 13.。领舰。夫嗓。
#include <iostream>
using namespace std;
int main()
{
? ? int a = 1;
? ? int b = 0;
? ? int sum = 1;
? ? int arr[20] = {0};
? ? for(int i=0; i<20; i++)
? ? {
? ? ? ? arr[i] = sum;? ? ? ? ? //存放最新值
? ? ? ? sum = a+b;? ? ? ? ? //更新sum
? ? ? ? b = a;? ? ? ? ? ? ? //迭代舊值
? ? ? ? a = sum;
? ? }
? ? //循環(huán)輸出數(shù)組元素
? ? for(int i=0; i<20; i++)
? ? {
? ? ? ? cout<<arr[i]<<" ";
? ? }
? ? return 0;
}
1.3 輸入流對象cin
1。 cin是來自于istream的類對象冲秽,用于輸入工作舍咖,功能上類似于scanf
2。 該類對象輸入時锉桑,也無需使用格式控制符
3排霉。輸入時,一般也不加endl
#include <iostream>
using namespace std;
int main()
{
? ? int num;
? ? cout<<"請輸入num的值";
? ? cin >> num;? ? ? ? ? ? ? ? ? //輸入整形變量
? ? double key;
? ? cout<<"請輸入key的值:";
? ? cin>>key;? ? ? ? ? ? ? ? ? ? ? ? //輸入小數(shù)
? ? char ch;
? ? cout<<"請輸入一個字符:";
? ? cin>>ch;? ? ? ? ? ? ? ? ? ? ? ? //輸出字符數(shù)據(jù)
? ? cout<<"num = "<<num<<"? key = "<<key<<"? ch = "<<ch<<endl;
? ? return 0;
}
練習(xí):提示并輸入一個字符民轴,判斷該字符值攻柠,如果是大寫字母球订,轉(zhuǎn)變成小寫字母輸出,如果是小寫字母轉(zhuǎn)變成大寫字母輸出瑰钮,如果是數(shù)字字符冒滩,輸出對應(yīng)的整數(shù)數(shù)字,如果是其他字符浪谴,則輸出‘*’旦部;
#include <iostream>
using namespace std;
int main()
{
? ? char i;
? ? cout<<"請輸入一個字符:";
? ?cin>>i;
? ? if(i>'a'&&i<'z')? ? ? ? //判斷是否為小寫字母
? ? {
? ? ? ? ? ? ? i-=32;
? ? ? ? cout<<i<<endl;
? ? }
? ? else if(i>'A'&&i<'Z')? ? ? ? ? ? //判斷是否為大寫字母
? ? {
? ? ? ? i+=32;
? ? ? ? cout<<i<<endl;
? ? }
? ? else if(i>'0'&&i<='9')
? ? {
? ? ? ? int b=i-'0';? ? ? ? ? ? ? //將數(shù)字字符轉(zhuǎn)換為整數(shù)
? ? ? ? cout<<b<<endl;
? ? }
? ? else
? ? {
? ? ? ? i='*';
? ? ? ? cout<<i;
? ? }
? ? return 0;
}
1.4 cout的格式化輸出
1。 對于部分關(guān)鍵字而言较店,可以不加指定的頭文件
2士八。如果使用的系統(tǒng)提供的函數(shù),需要加上對應(yīng)的頭文件:#include
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
? ? int num = 101;
? ? //使用關(guān)鍵字設(shè)置輸出進制數(shù)據(jù)
? ? cout<<"num = "<<num<<endl;? ? ? ? ? ? ? //101? 默認輸出10進制數(shù)據(jù)
? ? cout<<oct<<"num = "<<num<<endl;? ? ? ? ? //145? 輸出八進制 數(shù)據(jù)
? ? cout<<"num = "<<num<<endl;? ? ? ? ? ? ? //使用的是上一次改變后的進制數(shù)據(jù)
? ? cout<<hex<<"num = "<<num<<endl;? ? ? ? ? //65? ? 輸出16進制 數(shù)據(jù)
? ? cout<<dec<<"num = "<<num<<endl;? ? ? ? ? //101
? ? //使用函數(shù)設(shè)置輸出進制數(shù)據(jù)? 類似printf("%#x", 101);
? ??cout<<setbase(8)<<num<<endl; //145 設(shè)置8進制數(shù)據(jù)
? ? cout<<"num = "<<num<<endl;? ? ? ? ? ? ? //145
? ? cout<<setbase(16)<<num<<endl;? ? ? ? ? //輸出16進制數(shù)據(jù)
? ? cout<<setbase(10)<<num<<endl;? ? ? ? ? //輸出10進制數(shù)據(jù)
? ? cout<<"***************************************\n";
? ? //設(shè)置寬度梁呈,類似于printf("%-05d", 101);
? ? cout<<setw(5)<<num<<endl;? ? ? ? ? ? //設(shè)置寬度
? ? cout<<setw(5)<<setfill('*')<<num<<endl;? ? ? // 設(shè)置填充字符
? ? cout<<setw(5)<<setfill('*')<<left<<num<<endl;? ? //設(shè)置左對齊
? ? cout<<"***************************************\n";
? ? //輸出小數(shù):printf("%.2f", 3.1415926);
? ? double key = 3.14159265358;
? ? cout<<"key = "<<key<<endl;? ? ? ? ? ? ? ? ? ? ? //默認保留6為 有效數(shù)字
? ? cout<<"key = "<<setprecision(3)<<key<<endl;? ? ? //設(shè)置 保留3個有效數(shù)字
? ? cout<<"key = "<<setprecision(2)<<fixed<<key<<endl;? //fixed與setprecision共同作用時婚度,2表示的是保留小數(shù)的個數(shù)
? ? return 0;
}
運行結(jié)果
二、命名空間
2.1 C++中接觸到的名字有哪些
????????變量名官卡、數(shù)組名蝗茁、指針名、函數(shù)名寻咒、結(jié)構(gòu)體變量名哮翘、共用體變量名、函數(shù)指針名毛秘、枚舉名饭寺。。叫挟。艰匙。
2.2 命名空間的作用
1)主要作用是解決多人協(xié)同開發(fā)程序時名字污染(名字沖突)問題
2)所謂命名空間,其實相當于給名字加個“姓氏”
2.3 std命名空間的使用
1)命名空間必須先定義抹恳,后使用
2)當引入系統(tǒng)提供的頭文件時员凝,如果該頭文件提供某些名字,那么一定時定義在一個統(tǒng)一的命名空間中奋献,名為std
3)命名空間使用方式1:在使用該命名空間中的名字時健霹,直接加上命名空間名和作用域限定符,指名道姓的使用某個名字
例如:std::cout<<"hello ";
? ? ? ?命名空間使用方式2:提前將某個命名空間中的某個名字使用關(guān)鍵字using進行聲明瓶蚂,后期對該名字就可以直接使用了糖埋,但是,該命名空間中沒有提前聲明的名字扬跋,不能直接使用
例如:using std::cout;
????????????cout<<"hello world"阶捆;
????????命名空間的使用方式3:提前將整個命名空間進行聲明,使用關(guān)鍵字 using namespace 命名空間名钦听,聲明后洒试,該命名空間中的名字,就可以直接使用了朴上,無需再加命名空間名和作用域限定符了
#include <iostream>
//命名空間的使用方式2:將命名空間中的某個名字進行聲明
using std::cout;? ? ? ? ? //將cout這個名字進行聲明
//命名空間的使用方式3:將整個命名空間進行聲明
using namespace std;
int main()
{
? ? std::cout << "Hello World!" << std::endl; ?//使用方式1垒棋,連同命名空間名和作用域限定符一起使用
? ? cout<<"nihao"<<std::endl; ? //使用方式2的案例:由于名字已經(jīng)提前聲明,直接用即可,對于沒有提前聲明的名字痪宰,不能直接使用
? ? cout << "Hello World!" << endl; ?//使用方式3:整個命名空間進行聲明了叼架,命名空間中的名字直接使用即可
? ? return 0;
}
2.4 自命名空間
定義格式:
? ??namespace 命名空間名
? ??{
? ??? ??類型1? 名字1;
? ??? ??類型2? 名字2衣撬;
? ??? ??乖订。。具练。
? ??? ??類型n? 名字n乍构;
? ??}
例如:
#include <iostream>
#include<cstring>
using namespace std;
//自定義命名空間
namespace zpp
{
? ? char name[20];? ? ? ? //姓名
? ? int age;? ? ? ? ? ? //年齡
? ? double? score;? ? ? ? //分數(shù)
? ? void show();? ? ? ? ? ? ? ? //命名空間內(nèi)聲明一個函數(shù)
}
//對命名空間中的函數(shù)進行定義,定義時,需要在名字前加命名空間名和作用域限定符
void zpp::show()
{
? ? cout<<"name = "<<name<<endl;
? ? cout<<"age = "<<age<<endl;
? ? cout<<"score = "<<score<<endl;
}
//將命名空間中的某個名字提前聲明
using zpp::name;
//將整個命名空間全部聲明
using namespace zpp;
int main()
{
? ? zpp::age = 20;? ? ? ? ? ? ? ? //命名空間使用方式1
? ? strcpy(name, "zhangpengpeng");? //命名空間使用方式2
? ? score = 100;? ? ? ? ? ? ? ? ? ? //命名空間使用方式3
? ? show();? ? ? ? ? ? ? ? ? ? ? //由于整個命名空間全部聲明了扛点,所以命名空間中的所有名字可以直接使用
? ? return 0;
}
運行結(jié)果:
2.5 命名空間沖突問題
1) 不同的命名空間之間名字沖突問題哥遮,需要在產(chǎn)生沖突的名字前加命名空間名和作用域限定符解決
2) 命名空間中的名字與全局名稱沖突問題,如果使用命名空間中的名字陵究,需要加上命名空間名和作用域限定符眠饮,如果想要使用全局的名字,全局的名字默認放入匿名空間中铜邮,使用時只需要加上命名作用域限定符即可
3) 命名空間中的名字與局部名字沖突仪召,優(yōu)先使用局部的名字,如果非要使用命名空間中的名字松蒜,則需要加上命名空間名和作用域限定符
#include <iostream>
#include<cstring>
using namespace std;
//聲明一個命名空間
namespace zpp
{
? ? int num;
? ? double key;
? ? char name[20];
? ? void show(){}
}
//再聲明一個命名空間
namespace gqq
{
? ? int num;
}
//使用命名空間
using namespace zpp;
using namespace gqq;
//定義一個全局變量
double key;
int main()
{
? ? //沖突方式1:不同命名空間之間名字沖突
? ? zpp::num = 520;? ? ? ? //對zpp命名空間中的num進行使用
? ? gqq::num = 1314;? ? ? ? ? //對gqq命名空間中的num進行使用
? ? //沖突方式2:命名空間中的的名字與全局名字沖突
? ? zpp::key = 3.14;? ? ? ? ? //對zpp命名空間中的key進行使用
? ? ::key = 2.48;? ? ? ? ? ? ? //對全局變量中的key進行使用
? ? //沖突方式3:命名空間中的名字與局部名字相同時
? ? char name[20];
? ? strcpy(name, "zhangsan");? ? ? ? ? //此時使用的是局部變量中的name
? ? cout<<"name = "<<name<<"? zpp::name = "<<zpp::name<<endl;
? ? return 0;
}
2.6 命名空間使用的注意事項
1) 一個命名空間中可以嵌套定義一個命名空間返咱,使用名字時,需要用作用域限定符一級一級找到最低一級進行使用
2) 同一作用域下牍鞠,可以定義多個同名的命名空間咖摹,編譯時會將這對個同名的命名空間合成一個,所以难述,定義時萤晴,不允許出現(xiàn)名字有相同的現(xiàn)象
#include <iostream>
using namespace std;
namespace zpp {
? ? int num = 520;
? ? //命名空間中嵌套定義一個命名空間
? ? namespace gqq {
? ? ? ? int age;
? ? ? ? int num = 1314;
? ? }
}
//同一作用域下可以定義多個同名的命名空間
namespace zpp {
? ? //double num;? ? ? ? ? //但是,命名空間中的名字不能重復(fù)
? ? //void num();
? ? char name[20];
}
int main()
{
? ? cout << zpp::num << endl;? ? ? ? ? //520
? ? cout << zpp::gqq::num << endl;? ? ? //1314? ? 使用命名空間名和作用域限定符一級一級往下找
? ? return 0
}
三胁后、C++中的字符串(string)
3.1 C++中支持兩種風格的字符串
1) C語言風格的字符串依然支持店读,特點是有一個'\0'作為字符串結(jié)束標志,對于字符串的操作攀芯,通常基于字符數(shù)組來完成
2) C++風格的字符串殖演,本質(zhì)上是一個string類的類對象
2.2 string類型的使用
1) 單個字符串變量的初始化和賦值
? ? //定義一個字符串類型
? ? string s1;? ? ? ? ? //此時定義一個字符串變量
? ? cout<<"s1 = "<<s1<<endl;? ? ? //空串
? ? s1 = "hello world";? ? ? ? ? //給字符串變量賦值,相當于C語言的strcpy
? ? cout<<"s1 = "<<s1<<endl;? ? //hello world
? ? //定義一個字符串并直接 初始化
? ? string s2 = "ni hao";
? ? cout<<"s2 = "<<s2<<endl;? ? ? ? ? ? ? //ni hao
? ? //定義一個字符串并初始化
? ? string s3("I love China");
? ? cout<<"s3 = "<<s3<<endl;? ? ? ? ? ? //I love China
? ? //定義 一個字符串變量并初始化
? ? string s4(5,'A');
? ? cout<<"s4 = "<<s4<<endl;? ? ? ? ? ? ? //AAAAA
? ? //定義一個 字符串并初始化
? ? string s6{"good good study"};
? ? cout<<"s6 = "<<s6<<endl;? ? ? ? ? ? ? ? ? //good good study
2) 多個變量的初始化和賦值
? ? //使用一個字符串給另一個字符串變量初始化
? ? string s7 = s1;
? ? cout<<"s7 = "<<s7<<endl;? ? ? ? ? ? ? ? //hello world
? ? //使用一個字符串給另一個字符串初始化
? ? string s8(s2);
? ? cout<<"s8 = "<<s8<<endl;? ? ? ? ? ? ? ? ? //ni hao
? ? // 使用一個字符串給另一個字符串賦值
? ? s8 = s3;
? ? cout<<"s8 = "<<s8<<endl;? ? ? ? ? ? //I love China
? ? //使用一個字符串連接另一個字符串后賦值給一個新字符串
? ? string s9 = s1 + s3;? ? ? ? ? ? ? ? ? //相當于strcat
? ? cout<<"s9 = "<<s9<<endl;
? ? s9 = s1 + "lalalallalal";? ? ? ? ? ? ? ? //一個字符串變量加上一個字符串常量
? ? cout<<"s9 = "<<s9<<endl;
? ? s9 = "dudududuudu"+s1;? ? ? ? ? ? ? ? ? //一個字符串常量加上一個字符串變量
? ? cout<<"s9 = "<<s9<<endl;
案例
#include <iostream>
using namespace std;
int main()
{
? ? //定義一個字符串類型
? ? string s1;? ? ? ? ? //此時定義一個字符串變量
? ? cout<<"s1 = "<<s1<<endl;? ? ? //空串
? ? s1 = "hello world";? ? ? ? ? //給字符串變量賦值丸相,相當于C語言的strcpy
? ? cout<<"s1 = "<<s1<<endl;? ? //hello world
? ? //定義一個字符串并直接 初始化
? ? string s2 = "ni hao";
? ? cout<<"s2 = "<<s2<<endl;? ? ? ? ? ? ? //ni hao
? ? //定義一個字符串并初始化
? ? string s3("I love China");
? ? cout<<"s3 = "<<s3<<endl;? ? ? ? ? ? //I love China
? ? //定義 一個字符串變量并初始化
? ? string s4(5,'A');
? ? cout<<"s4 = "<<s4<<endl;? ? ? ? ? ? ? //AAAAA
? ? //定義一個 字符串并初始化
? ? string s6{"good good study"};
? ? cout<<"s6 = "<<s6<<endl;? ? ? ? ? ? ? ? ? //good good study
? ? cout<<"**************************************************"<<endl;
? ? //使用一個字符串給另一個字符串變量初始化
? ? string s7 = s1;
? ? cout<<"s7 = "<<s7<<endl;? ? ? ? ? ? ? ? //hello world
? ? //使用一個字符串給另一個字符串初始化
? ? string s8(s2);
? ? cout<<"s8 = "<<s8<<endl;? ? ? ? ? ? ? ? ? //ni hao
? ? // 使用一個字符串給另一個字符串賦值
? ? s8 = s3;
? ? cout<<"s8 = "<<s8<<endl;? ? ? ? ? ? //I love China
? ? //使用一個字符串連接另一個字符串后賦值給一個新字符串
? ? string s9 = s1 + s3;? ? ? ? ? ? ? ? ? //相當于strcat
? ? cout<<"s9 = "<<s9<<endl;
? ? s9 = s1 + "lalalallalal";? ? ? ? ? ? ? ? //一個字符串變量加上一個字符串常量
? ? cout<<"s9 = "<<s9<<endl;
? ? s9 = "dudududuudu"+s1;? ? ? ? ? ? ? ? ? //一個字符串常量加上一個字符串變量
? ? cout<<"s9 = "<<s9<<endl;
? ? //s9 = "didididii"+"dadadadada";? ? ? ? ? //不允許操作
? ? return 0;
}
3.3 C風格字符串與C++風格字符串互相轉(zhuǎn)換
1) C語言風格的字符串可以無條件轉(zhuǎn)換為C++風格字符串
2) C++風格字符串向C語言風格字符串轉(zhuǎn)換時灭忠,需要調(diào)用其成員函數(shù)c_str()或者data()
#include <iostream>
#include<cstring>
using namespace std;
int main()
{
? ? char s1[20];
? ? string s2 = "hello";? ? ? ? ?
? ? //s2 = s1;? ? ? ? ? //C語言風格向c++風格字符串轉(zhuǎn)換
? ? //s1 = s2;? ? ? ? ? ? ? //C++風格字符串不能直接轉(zhuǎn)換為C風格字符串
? ? //strcpy(s1, s2.c_str());
? ? strcpy(s1, s2.data());
? ? cout<<"s1 = "<<s1<<endl;? ? ? ? //hello
? ? return 0;
}
3.4 字符串的比較
1) C語言風格的字符串比較需要使用strcmp來完成
2) C++風格的字符串比較弛作,不需要使用strcmp函數(shù)华匾,直接使用關(guān)系運算符即可
#include <iostream>
#include<cstring>
using namespace std;
int main()
{
? ? char s1[20];
? ? string s2 = "hello";
? ? //s2 = s1;? ? ? ? ? //C語言風格向c++風格字符串轉(zhuǎn)換
? ? //s1 = s2;? ? ? ? ? ? ? //C++風格字符串不能直接轉(zhuǎn)換為C風格字符串
? ? //strcpy(s1, s2.c_str());
? ? strcpy(s1, s2.data());
? ? cout<<"s1 = "<<s1<<endl;? ? ? ? //hello
? ? string s3 = "world";
? ? if(s2 > s3)? ? ? ? ? ? ? ? //字符串的比較可以直接使用關(guān)系運算符來完成
? ? {
? ? ? ? cout<<"s2大"<<endl;
? ? }else if(s2 < s3)
? ? {
? ? ? ? cout<<"s3大"<<endl;
? ? }else if(s2 == s3)
? ? {
? ? ? ? cout<<"一樣大"<<endl;
? ? }
? ? return 0;
}
3.5 C++風格字符串的常用函數(shù)
1) size()瘦真、length() :該函數(shù)返回字符串的實際長度刊头,不包含'\0'
2) empty():? ? 判斷該字符串是否為空,如果為空串诸尽,則返回真原杂,否則返回假
3) clear():將字符串中的內(nèi)容清空
4) at():返回字符串中給定位置的字符
#include <iostream>
using namespace std;
int main()
{
? ? string s1;
? ? //求字符串實際長度
? ? cout<<"size of s1 = "<<s1.size()<<endl;
? ? cout<<"size of s1 = "<<s1.length()<<endl;
? ? //判斷字符串 是否為空
? ? if(s1.empty())
? ? {
? ? ? ? cout<<"字符串為空"<<endl;
? ? }else
? ? {
? ? ? ? cout<<"字符串非空"<<endl;
? ? }
? ? s1 = "good good study day day up";? ? //給字符串賦值
? ? cout<<"size of s1 = "<<s1.size()<<endl;
? ? //判斷字符串 是否為空
? ? if(s1.empty())
? ? {
? ? ? ? cout<<"字符串為空"<<endl;
? ? }else
? ? {
? ? ? ? cout<<"字符串非空"<<endl;
? ? }
? ? // 調(diào)用函數(shù)清空字符串中內(nèi)容
? ? s1.clear();
? ? cout<<"size of s1 = "<<s1.size()<<endl;
? ? //判斷字符串 是否為空
? ? if(s1.empty())
? ? {
? ? ? ? cout<<"字符串為空"<<endl;
? ? }else
? ? {
? ? ? ? cout<<"字符串非空"<<endl;
? ? }
? ? cout<<"*************************************"<<endl;
? ? string s2 = "hello world";
? ? s2.at(0) = 'H';? ? ? ? ? ? ? //訪問字符串中的元素,有數(shù)組下標越界檢測您机,當越界后穿肄,拋出異常
? ? cout<<"s2 = "<<s2<<endl;
? ? s2[6] = 'W';? ? ? ? ? ? ? ? ? ? //通過下標訪問字符串中的元素,無越界檢測
? ? cout<<"s2 = "<<s2<<endl;
? ? return 0;
}
3.6 字符串的輸入輸出
1) 如果字符串中沒有回車际看、空格咸产、tab鍵,則可以直接使用cin完成
2) 如果有空格的輸入仲闽,需要使用全局函數(shù)getline來完成
#include <iostream>
using namespace std;
int main()
{
? ? string s1;
? ? cout<<"請輸入一個字符串:";
? ? //cin>>s1;? ? ? ? ? //該輸入不能輸入空格
? ? getline(cin, s1);? ? ? ? ? ? //可以輸入空格
? ? //參數(shù)1:輸入流對象
? ? //參數(shù)2:輸入后字符串的容器
? ? cout<<"s1 = "<<s1<<endl;
? ? return 0;
}
練習(xí):提示并輸入一個字符串脑溢,統(tǒng)計該字符串中的大小字母個數(shù)、小寫字母個數(shù)赖欣、數(shù)字個數(shù)屑彻、空格個數(shù)、其他字符個數(shù)并輸出
#include <iostream>
using namespace std;
int main()
{
? ? string s1;
? ? cout<<"請輸入一個字符串:";
? ? getline(cin,s1);
? ? cout<<"s1="<<s1.size()<<endl;
? ? unsigned int i;
? ? int count1=0,count2=0,count3=0,count4=0,count5=0;
? ? for( i=0;i<s1.size();i++)
? ? {
? ? ? ? if(s1.at(i)==' ')
? ? ? ? {
? ? ? ? ? ? count1++;? ? ? ? ? //空格個數(shù)累計
? ? ? ? }else if(s1.at(i)>='A'&&s1.at(i)<='Z')
? ? ? ? {
? ? ? ? ? ? count2++;? ? ? //累計大寫字母
? ? ? ? }else if(s1.at(i)>='a'&&s1.at(i)<='z')
? ? ? ? {
? ? ? ? ? ? count3++;? ? ? ? ? ? ? //累計小寫字母
? ? ? ? }else if(s1.at(i)>='0'&&s1.at(i)<='9')
? ? ? ? {
? ? ? ? ? ? count4++;? ? ? ? //累計數(shù)字字符
? ? ? ? }else
? ? ? ? {
? ? ? ? ? ? count5++;? ? ? ? ? ? //累計其他字符
? ? ? ? }
? ? }
? ? cout<<"空格個數(shù):"<<count1<<endl;
? ? cout<<"大寫字母個數(shù):"<<count2<<endl;
? ? cout<<"小寫字母個數(shù):"<<count3<<endl;
? ? cout<<"數(shù)字個數(shù):"<<count4<<endl;
? ? cout<<"其他字符個數(shù):"<<count5<<endl;
? ? return 0;
}
四顶吮、bool類型
1) C語言中不支持bool類型社牲,但是C++中支持bool類型
2) bool類型的值只有兩個:true(非0數(shù)字)、false(0),這兩個關(guān)鍵字悴了,用于bool類型的真和假
3) bool類型的數(shù)據(jù)搏恤,默認使用數(shù)字表示真假违寿,如果非要使用單詞表示,則需要使用關(guān)鍵字boolalpha來調(diào)整
轉(zhuǎn)化后熟空,就一直使用單詞表示,如果還想繼續(xù)使用數(shù)字菌瘪,則需要使用關(guān)鍵字noboolalpha調(diào)整
4) bool類型的變量所占內(nèi)存1字節(jié)阱当,本質(zhì)上只需要1bit即可弊添,但是油坝,內(nèi)存分配的基本單位是字節(jié)
#include <iostream>
using namespace std;
int main()
{
? ? bool b1 = 10;
? ? cout<<"b1 = "<<b1<<endl;? ? ? ? ? //1
? ? bool b2 = -10;
? ? cout<<"b2 = "<<b2<<endl;? ? ? ? ? ? //1
? ? bool b3 = 0;
? ? cout<<"b3 = "<<b3<<endl;? ? ? ? ? ? //0
? ? bool b4 = true;
? ? cout<<"b4 = "<<b4<<endl;? ? ? ? ? ? //1
? ? bool b5 = false;
? ? cout<<"b5 = "<<b5<<endl;? ? ? ? ? ? //0
? ? cout<<"**************************************"<<endl;
? ? cout<<"b1 = "<<boolalpha<<b1<<endl;? ? ? //true
? ? cout<<"b2 = "<<b2<<endl;? ? ? ? ? ? ? ? //true
? ? cout<<"b3 = "<<b3<<endl;? ? ? ? ? ? ? ? //false
? ? cout<<"**************************************"<<endl;
? ? cout<<"b4 = "<<noboolalpha<<b4<<endl;? ? //1
? ? cout<<"b5 = "<<b5<<endl;? ? ? ? ? ? ? ? //0
? ? cout<<"size of bool = "<<sizeof (bool)<<endl;? ? ? ? //1
? ? return 0;
}
個人感覺:
1)C與C++是親戚帆啃。C++繼承了C的優(yōu)點努潘,并發(fā)展了自己的個性“類”报慕。所謂的類眠冈,就像是把一些有關(guān)的事物性質(zhì)方法打包起來蜗顽,并提供用法(術(shù)語端口)
2)由于C++有“類”的概念诫舅,那里面的屬性刊懈、方法什么都有比較強的歸屬感匾浪。比如倘是,a)要使用函數(shù)混稽,就要聲名是誰個空間的退腥;b)調(diào)用屬性苗胀、方法也得有歸屬感基协。string sss= "fdsafdsafdsa fwq4t4231t" ; cout<<sss.length();
3) ?string, 在C語言中就比較特殊;在C++中更加特殊刨疼。必須掌握它的特殊用法
4)bool , 在C語言中沒有亭畜;在C++中有