01.C++(一)----面向对象的思想
(創(chuàng)建于2017/12/20)
1.命名空間
namespace :C++引入的用于解決多個(gè)模塊間命名沖突問題的一個(gè)機(jī)制,他是一個(gè)由程序設(shè)計(jì)者命名的內(nèi)存區(qū)域,程序設(shè)計(jì)者可以根據(jù)需要指定一些有名字的空間域,把一些全局實(shí)體分別放在各個(gè)命名空間中,從而與其他全局實(shí)體分隔開來。
#include <stdlib.h> #include<iostream> //標(biāo)準(zhǔn)命名空間(包含很多標(biāo)準(zhǔn)的定義) //命名空間類似于Java中的包 using namespace std;//自定義命名空間 namespace NSP_A {int a = 9;struct Teacher{char name[29];int age;};struct Student{char name[29];int age;}; }namespace NSP_B {int a = 12;//命名空間嵌套namespace NSP_C {int c = 90;}struct Teacher{char name[29];int age;};struct Student{char name[29];int age;}; }void main() {//<<運(yùn)算符重載//std::cout << "this is a c ++" << std::endl;//上邊一行可以寫成下邊的樣子,不過需要添加 using namespace std;cout << "this is a c++" << endl;//使用命名空間//::訪問修飾符cout << NSP_A::a << endl;cout << NSP_B::a << endl;//訪問命名空間中的命名空間的值cout << NSP_B::NSP_C::c << endl;//訪問命名空間中的結(jié)構(gòu)體(struct寫與不寫都可以)//struct NSP_A::Teacher t;//t.age = 123;//struct NSP_A::Student s;//s.age = 12;//上邊四行可以寫作這種形式using namespace NSP_A;Teacher t;t.age = 123;Student s;s.age = 12;cout << t.age << endl;cout << s.age << endl;//如果多個(gè)命名空間中有相同的比如說結(jié)構(gòu)體,我們需要每個(gè)都訪問到(似乎會包重復(fù)的問題)//嚴(yán)重性 代碼 說明 項(xiàng)目 文件 行 禁止顯示狀態(tài)//錯(cuò)誤 C2086 “NSP_A::Student s” : 重定義 C++_study c : \users\renzhenming\documents\visual studio 2015\projects\c++_study\c++_study\1.cpp 75//Student s;//s.age = 300;//cout << s.age << endl;using NSP_B::Student;Student s1;s1.age = 200; cout << s1.age << endl;system("pause"); }輸出結(jié)果:this is a c++ 9 12 90 123 12 200 請按任意鍵繼續(xù). . .(2018年7月29日補(bǔ)充)
2.第一個(gè)c++程序
#include "iostream" //包含c++的頭文件//使用std標(biāo)準(zhǔn)命名空間,在這個(gè)空間中定義了很多標(biāo)準(zhǔn)定義 using namespace std;void main() {//輸出到屏幕cout << "hello world" << endl;system("pause"); }2.以面向過程的方式求圓的面積
#include "iostream" //包含c++的頭文件//使用std標(biāo)準(zhǔn)命名空間,在這個(gè)空間中定義了很多標(biāo)準(zhǔn)定義 using namespace std;void main() {double r = 0;double s = 0;cout << "請輸入圓的半徑" << endl;//cin標(biāo)準(zhǔn)輸入,表示鍵盤cin >> r;cout <<"半徑的值是:"<<r << endl;s = 3.14*r*r;//輸出到屏幕cout << "圓的面積是s:"<<s << endl;system("pause"); }3.以面向?qū)ο蟮姆绞角髨A的面積
C++雖然是基于c語言,但是二者有本質(zhì)不同,C++是面向?qū)ο缶幊?#xff0c;C語言是面向過程編程,學(xué)習(xí)c++要首先進(jìn)行思想的轉(zhuǎn)變,對于由Java基礎(chǔ)的同學(xué)來說,這一點(diǎn)理解起來會比較容易,既然以面向?qū)ο蟮姆绞浇鉀Q這個(gè)需求,那么很明顯,圓就是我們要處理的這個(gè)對象
#include "iostream" //包含c++的頭文件//使用std標(biāo)準(zhǔn)命名空間,在這個(gè)空間中定義了很多標(biāo)準(zhǔn)定義 using namespace std;//在c++中定義了一個(gè)自定義數(shù)據(jù)類型Circle class Circle { //成員變量 public類型的 public:double m_s; //面積double m_r; //半徑 //成員函數(shù),public類型 public:void setR(double r) {m_r = r;}double getR() {return m_r;}double getS() {m_s = 3.14*m_r*m_r;return m_s;} };void main() {//用類定義三個(gè)對象Circle c1, c2, c3;double r;cout << "請輸入半徑:"<< endl;cin >> r;c1.setR(r);cout << "圓的面積是s:"<<c1.getS()<< endl;system("pause"); }類是一個(gè)數(shù)據(jù)類型(固定大小內(nèi)存塊的別名),定義一個(gè)類,是一個(gè)抽象的概念,此時(shí)不會分配內(nèi)存,只有在用數(shù)據(jù)類型定義變量的時(shí)候才會分配內(nèi)存。上邊的代碼中使用一個(gè)數(shù)據(jù)類型定義了三個(gè)變量c1 c2 c3,那么在c1調(diào)用類方法的時(shí)候,編譯器是如何區(qū)分c1 c2 c3的呢?
3.C++對C的擴(kuò)展
a.namespace命名空間
b.實(shí)用性加強(qiáng)
在早期C語言編譯器中,變量必須在使用域開始的地方定義,否則編譯無法通過,如下這種方式是錯(cuò)誤的,因?yàn)樵诖蛴≌Z句之后又定義了一個(gè)變量b,正確的寫法是先定義在打印。不過c++改變了這種情況,在c++中只要在使用前定義即可,位置沒有要求
#include <stdio.h> int main() {int a=1;printf("%d\n", a);int b = 2;printf("%d\n", b);system("pause");return 0; }c.變量檢測
C語言中,重復(fù)定義的同名全局變量是合法的,多個(gè)全局變量會被鏈接到全局?jǐn)?shù)據(jù)區(qū)的同一個(gè)地址空間
int a; int a = 1;在c++中,拒絕這種二次定義的形式,編譯無法通過
d.struct類型加強(qiáng)
1.c語言的struct定義了一組變量的集合,c編譯器并不認(rèn)為這是一種新的類型,c++的struct是一個(gè)新類型的定義聲明。什么意思?看下邊這種使用結(jié)構(gòu)體的方式在C語言編譯器是無法編譯通過的,定義結(jié)構(gòu)體變量要前邊加struct關(guān)鍵字。但是在c++編譯器是可以的
2.另外,c++中,結(jié)構(gòu)體內(nèi)的變量也可以使用權(quán)限修飾符public protected等
3.c++中的結(jié)構(gòu)體可以和class完成相同的功能
e.register關(guān)鍵字增強(qiáng)
register關(guān)鍵字請求編譯器將局部變量存儲在寄存器中,使用register修飾變量,暗示編譯程序相應(yīng)的變量將被頻繁的使用,應(yīng)盡可能(不是絕對的,是在寄存器空閑的狀態(tài)下有效)的將它保存在寄存器中,以加快存儲速度。在C語言中register關(guān)鍵字定義的變量無法取地址,并且只有手動加上register關(guān)鍵字的變量才會有可能被優(yōu)化。c++中也支持register關(guān)鍵字,不過c++有自己的優(yōu)化方式,不使用register關(guān)鍵字也可以根據(jù)情況自動判斷是否需要對代碼進(jìn)行優(yōu)化,c++可以取得register變量的地址。
f.c++中所有變量和函數(shù)都必須有類型
C語言中默認(rèn)類型在c++中是不合法的
g.新增bool類型
bool可取值只有true false,理論上只占一個(gè)字節(jié),true代表真值,編譯器內(nèi)部用1表示,false表示非真,編譯器內(nèi)部用0表示
h.C++和C語言的三目運(yùn)算符
C語言返回變量的值,C++返回變量的本身
C語言中的三目運(yùn)算符返回的是變量值,不能做左值使用,C++中的三目運(yùn)算符可直接返回變量本身,因此可以出現(xiàn)在程序任何地方
如下是在C語言中,編譯器直接提示表達(dá)式必須是可修改的左值,因?yàn)镃語言三目運(yùn)算符返回的是變量的值,那么因?yàn)閍小于b,所以返回a的值,a的值是10,然后將30賦值給10,這是錯(cuò)誤的。常量無法被修改
#include <stdio.h> int main() {int a = 10;int b = 20;(a < b ? a : b) = 30;system("pause");return 0; }在C++中會怎樣呢?
#include "iostream" //包含c++的頭文件 using namespace std; int main() {int a = 10;int b = 20;(a < b ? a : b) = 30;cout << a<< endl;system("pause");return 0; }可以發(fā)現(xiàn)編譯通過并且打印a的值為30,因?yàn)镃++三目運(yùn)算符返回的是變量本身,相當(dāng)于多了一步取地址的操作,然后直接操作a指向的內(nèi)存空間
C語言如何實(shí)現(xiàn)這種效果?只需要稍作改動,其實(shí)c++中編譯器相當(dāng)于幫我們做了這一步
#include <stdio.h>int main() {int a = 10;int b = 20;*(a < b ? &a : &b) = 30;printf("a=%d\n", a);system("pause");return 0; }i.C和C++中的const
const的作用是為了防止變量被修改,但實(shí)際上在C語言中,const是有缺陷的
C語言代碼,可以發(fā)現(xiàn)通過指針修改了const變量a
#include <stdio.h>int main() {const int a = 10;int *p = &a;printf("*p=%d\n", *p);printf("a=%d\n", a);system("pause");return 0; }在c++中,這段代碼無法編譯通過,測試使用的編譯器是Visual Studio2015,可能在早期的版本上編譯可以通過,但是運(yùn)行無法修改const常量值。c++編譯器是怎么做到的?相對于C語言,c++編譯器會將const變量存入符號表中,當(dāng)你要使用這個(gè)變量的時(shí)候在符號表中取出,而當(dāng)你通過取地址的方式賦值給一個(gè)指針的時(shí)候,編譯器會在內(nèi)存中拷貝一份這個(gè)變量,所以你同過指針修改的變量跟符號表中的這個(gè)變量并沒有關(guān)系,從而保證const變量不被修改
//嚴(yán)重性 代碼 說明 項(xiàng)目 文件 行 禁止顯示狀態(tài) //錯(cuò)誤 C2440 “初始化”: 無法從“const int *”轉(zhuǎn)換為“int *” Project8 c:\users\renzhenming //documents\visual studio 2015\projects\project8\project8\a.cpp 5 //錯(cuò)誤(活動) "const int *" 類型的值不能用于初始化 "int *" 類型的實(shí)體 Project8 //c:\Users\renzhenming\Documents\Visual Studio 2015\Projects\Project8\Project8\a.cpp //5 #include "iostream" //包含c++的頭文件 using namespace std; int main() {const int a = 10;int *p = &a;cout << "*p=%d\n"<<*p << endl;cout << "a=%d\n"<<a << endl;system("pause");return 0; }const變量區(qū)別
C語言中const變量
是只讀變量,有自己的存儲空間
c++中的const常量
可能分配空間,也可能不分配
當(dāng)const常量為全局,并且需要在其他文件中使用,會分配空間
當(dāng)使用&操作符,取const常量地址時(shí),會分配空間
當(dāng)const int &a = 10; const修飾引用時(shí),也會分配空間
總結(jié)
以上是生活随笔為你收集整理的01.C++(一)----面向对象的思想的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10 uwp 打包第三方字体到应用
- 下一篇: C++学习-3