用java写秋道程序_Java开发者使用C++写程序踩的坑
筆者是一個(gè)很矛盾的人。平時(shí)用Java。但是一開(kāi)始學(xué)習(xí)的時(shí)候?qū)W的是匯編語(yǔ)言,而且對(duì)C語(yǔ)言也很熟悉。為什么不學(xué)C++呢?是因?yàn)槲铱梢酝耆肑ava的編碼規(guī)范去寫(xiě)C++。因此我不需要了解更多的諸如C++的命名空間,操作符重構(gòu),友元函數(shù),多繼承這些更復(fù)雜的特性。
雖然C++介于Java和C之間,我并不需要學(xué)C++(開(kāi)發(fā)用Java,腳本用ruby,python,JavaScript)、但是作為一個(gè)計(jì)算機(jī)從業(yè)人員。不了解C++有點(diǎn)說(shuō)不過(guò)去。
首先我先總結(jié)這次我學(xué)習(xí)C++的特性:(參考資料:菜鳥(niǎo)教程)
一、using namespace std
第一個(gè)讓我疑惑的是using namespace std;
話(huà)說(shuō)回來(lái)這個(gè)是什么意思?
當(dāng)我對(duì)比了下Java文件的命名規(guī)范(類(lèi)名=文件名.java),我就懂了。
使用Java開(kāi)發(fā)的人都明白一個(gè)道理、當(dāng)你import 一個(gè)類(lèi)的時(shí)候,Java 的包名.類(lèi)名的文件定義,而且一切皆對(duì)象,會(huì)使你不會(huì)遇到諸如C++名稱(chēng)空間的這種錯(cuò)誤。
例如你在頭文件中定義一個(gè)函數(shù),這個(gè)函數(shù)如果被別人又定義了,在編譯時(shí)會(huì)報(bào)錯(cuò)的。因此C++語(yǔ)言加了個(gè)命名空間的語(yǔ)言特性。
有的同學(xué)可能問(wèn)了,如果函數(shù)名重復(fù)了話(huà),可以重構(gòu)啊,。。。但是要是參數(shù)都一樣呢?
所以C++會(huì)用這種方式,定義了一個(gè)解決問(wèn)題的方法。
下面是別人總結(jié)的。
命名空間(namespace)是一種描述邏輯分組的機(jī)制,可以將按某些標(biāo)準(zhǔn)在邏輯上屬于同一個(gè)集團(tuán)的聲明放在同一個(gè)命名空間中。
原來(lái)C++標(biāo)識(shí)符的作用域分成三級(jí):代碼塊({……},如復(fù)合語(yǔ)句和函數(shù)體)、類(lèi)和全局。現(xiàn)在,在其中的類(lèi)和全局之間,標(biāo)準(zhǔn)C++又添加了命名空間這一個(gè)作用域級(jí)別。
命名空間可以是全局的,也可以位于另一個(gè)命名空間之中,但是不能位于類(lèi)和代碼塊中。所以,在命名空間中聲明的名稱(chēng)(標(biāo)識(shí)符),默認(rèn)具有外部鏈接特性(除非它引用了常量)。
在所有命名空間之外,還存在一個(gè)全局命名空間,它對(duì)應(yīng)于文件級(jí)的聲明域。因此,在命名空間機(jī)制中,原來(lái)的全局變量,現(xiàn)在被認(rèn)為位于全局命名空間中。
標(biāo)準(zhǔn)C++庫(kù)(不包括標(biāo)準(zhǔn)C庫(kù))中所包含的所有內(nèi)容(包括常量、變量、結(jié)構(gòu)、類(lèi)和函數(shù)等)都被定義在命名空間std(standard標(biāo)準(zhǔn))中了。
std又是什么呢? std是頭文件中的一個(gè)命名空間。包含了cin cout endl等函數(shù)。
using 指的是用這個(gè)命名空間的函數(shù)。
具體使用如下:
#include
using namespacestd;//first name space
namespacefirst_space{voidfunc(){
cout<< "Inside first_space" <
}
}//second name space
namespacesecond_space{voidfunc(){
cout<< "Inside second_space" <
}
}intmain () {//Calls function from first name space.
first_space::func();//Calls function from second name space.
second_space::func();return 0;
}
二、類(lèi)Class的定義
C++除了支持C語(yǔ)言中的結(jié)構(gòu)體struct外,還支持class。
C語(yǔ)言中的struct里面不能放方法、但是C++可以。
很多時(shí)候class和struct的差別其實(shí)不大。好像在默認(rèn)訪(fǎng)問(wèn)權(quán)限和繼承方式有所不同,其余的我也沒(méi)看到什么新特征。
不過(guò)C++與Java的區(qū)別在于C++可以在定義類(lèi)之后,在其他地方定義方法。這個(gè)在Java里面是不行的。Java不可以這樣。(別跟我說(shuō)重載)
具體的實(shí)現(xiàn)如下:
#include
using namespacestd;classBox
{public:double length; //長(zhǎng)度
double breadth; //寬度
double height; //高度
};intmain( )
{
Box Box1;//聲明 Box1,類(lèi)型為 Box
Box Box2; //聲明 Box2,類(lèi)型為 Box
double volume = 0.0; //用于存儲(chǔ)體積//box 1 詳述
Box1.height = 5.0;
Box1.length= 6.0;
Box1.breadth= 7.0;//box 2 詳述
Box2.height = 10.0;
Box2.length= 12.0;
Box2.breadth= 13.0;//box 1 的體積
volume = Box1.height * Box1.length *Box1.breadth;
cout<< "Box1 的體積:" << volume <
volume = Box2.height * Box2.length *Box2.breadth;
cout<< "Box2 的體積:" << volume <
}
同時(shí),類(lèi)的繼承和Java也有區(qū)別,他這個(gè)居然直接+:就好了,,,呵呵呵
在派生類(lèi)(繼承類(lèi))中的使用如下
#include
using namespacestd;//基類(lèi)
classShape
{public:void setWidth(intw)
{
width=w;
}void setHeight(inth)
{
height=h;
}protected:intwidth;intheight;
};//派生類(lèi)
class Rectangle: publicShape
{public:intgetArea()
{return (width *height);
}
};int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);//輸出對(duì)象的面積
cout << "Total area:" << Rect.getArea() <
}
還有關(guān)于多態(tài)的問(wèn)題,和Java差不多。這個(gè)我沒(méi)有特別細(xì)究。應(yīng)該沒(méi)什么區(qū)別吧。。
多態(tài)的示例程序如下:
#include
using namespacestd;classShape {protected:intwidth, height;public:
Shape(int a=0, int b=0)
{
width=a;
height=b;
}intarea()
{
cout<< "Parent class area :" <
}
};class Rectangle: publicShape{public:
Rectangle(int a=0, int b=0):Shape(a, b) { }intarea ()
{
cout<< "Rectangle class area :" <
}
};class Triangle: publicShape{public:
Triangle(int a=0, int b=0):Shape(a, b) { }intarea ()
{
cout<< "Triangle class area :" <
}
};//程序的主函數(shù)
intmain( )
{
Shape*shape;
Rectangle rec(10,7);
Triangle tri(10,5);//存儲(chǔ)矩形的地址
shape = &rec;//調(diào)用矩形的求面積函數(shù) area
shape->area();//存儲(chǔ)三角形的地址
shape = &tri;//調(diào)用三角形的求面積函數(shù) area
shape->area();return 0;
}
Java的抽象函數(shù)和接口在C++里面也有體現(xiàn)
對(duì)應(yīng)的叫虛函數(shù)。
虛函數(shù)?是在基類(lèi)中使用關(guān)鍵字?virtual?聲明的函數(shù)。在派生類(lèi)中重新定義基類(lèi)中定義的虛函數(shù)時(shí),會(huì)告訴編譯器不要靜態(tài)鏈接到該函數(shù)。
我們想要的是在程序中任意點(diǎn)可以根據(jù)所調(diào)用的對(duì)象類(lèi)型來(lái)選擇調(diào)用的函數(shù),這種操作被稱(chēng)為動(dòng)態(tài)鏈接,或后期綁定。
classShape {protected:intwidth, height;public:
Shape(int a=0, int b=0)
{
width=a;
height=b;
}//pure virtual function
virtual int area() = 0;
};
然后子類(lèi)繼承后,就順利的重載。
接口的話(huà),就是完完全全的那種純虛函數(shù)。
像這種的
classBox
{public://純虛函數(shù)
virtual double getVolume() = 0;private:double length; //長(zhǎng)度
double breadth; //寬度
double height; //高度
};
三、模板
在Java里面沒(méi)有模板的概念。那個(gè)叫泛型。在集合類(lèi),容器類(lèi)等等應(yīng)用十分廣泛。但是C++這里不知道為啥又叫模板又叫泛型。。管他呢反正都是一個(gè)東西。
定義的如下
template ret-type func-name(parameter list)
{//函數(shù)的主體
}
具體的實(shí)現(xiàn)如下
#include #include
using namespacestd;
templateinline Tconst& Max (T const& a, T const&b)
{return a < b ?b:a;
}intmain ()
{int i = 39;int j = 20;
cout<< "Max(i, j):" << Max(i, j) <
cout<< "Max(f1, f2):" << Max(f1, f2) <
cout<< "Max(s1, s2):" << Max(s1, s2) <
}
這樣就實(shí)現(xiàn)了類(lèi)似于Java中的集合類(lèi)的方法。
四、操作符的重載
重載這個(gè)我是真感覺(jué)C++太自由了。
也許C++本就不是為工程而設(shè)計(jì)的。
而是為一群真正的計(jì)算機(jī)愛(ài)好者定制的。
Java除了String 貌似別的都不行。哈哈
重載的運(yùn)算符是帶有特殊名稱(chēng)的函數(shù),函數(shù)名是由關(guān)鍵字 operator 和其后要重載的運(yùn)算符符號(hào)構(gòu)成的。與其他函數(shù)一樣,重載運(yùn)算符有一個(gè)返回類(lèi)型和一個(gè)參數(shù)列表。
像這樣:
#include
using namespacestd;classBox
{public:double getVolume(void)
{return length * breadth *height;
}void setLength( doublelen )
{
length=len;
}void setBreadth( doublebre )
{
breadth=bre;
}void setHeight( doublehei )
{
height=hei;
}//重載 + 運(yùn)算符,用于把兩個(gè) Box 對(duì)象相加
Box operator+(const Box&b)
{
Box box;
box.length= this->length +b.length;
box.breadth= this->breadth +b.breadth;
box.height= this->height +b.height;returnbox;
}private:double length; //長(zhǎng)度
double breadth; //寬度
double height; //高度
};//程序的主函數(shù)
intmain( )
{
Box Box1;//聲明 Box1,類(lèi)型為 Box
Box Box2; //聲明 Box2,類(lèi)型為 Box
Box Box3; //聲明 Box3,類(lèi)型為 Box
double volume = 0.0; //把體積存儲(chǔ)在該變量中//Box1 詳述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);//Box2 詳述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);//Box1 的體積
volume =Box1.getVolume();
cout<< "Volume of Box1 :" << volume <
volume =Box2.getVolume();
cout<< "Volume of Box2 :" << volume <
Box3 = Box1 +Box2;//Box3 的體積
volume =Box3.getVolume();
cout<< "Volume of Box3 :" << volume <
}
總結(jié)
我真心覺(jué)得很多學(xué)生說(shuō)C++難不是因?yàn)镃++真的難,而是這種高自由的語(yǔ)法,很難讓一個(gè)初學(xué)者學(xué)生去掌握。對(duì)于學(xué)生來(lái)說(shuō)最好先規(guī)范計(jì)算機(jī)的思維然后再學(xué)習(xí)C++,同時(shí)推薦大家去學(xué)Java。找工作簡(jiǎn)單,語(yǔ)言簡(jiǎn)單。
而要說(shuō)精通C++我覺(jué)得至少要把GCC 或者Clang 都學(xué)個(gè)精通才算精通吧。畢竟語(yǔ)言的使用只是語(yǔ)言的一部分。
總結(jié)
以上是生活随笔為你收集整理的用java写秋道程序_Java开发者使用C++写程序踩的坑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iis无法启动计算机上的服务器,Win7
- 下一篇: php html采集,php file_