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