出於需要,最近研究C/C++.簡單熟悉一下這個讓我遺忘多年的語言。作為學習,在這裡記錄。同時對比C與C++的差別。
C的代碼:
#include <stdio.h>
#include <stdlib.h>
/**
* 定義一個結構體
*/
struct Location {
int x; // 橫坐標
int y; // 縱坐標
} location;
int main(void) {
printf("輸入X坐標:\t\n");
int x;
scanf("%d", &x);
location.x = x;
printf("輸入Y坐標:\t\n");
int y;
scanf("%d", &y);
location.y = y;
printf("X坐標是:\t%d\n", location.x);
printf("Y坐標是:\t%d\n", location.y);
// 做倒三角打印
int i;
for (i = 0; i < y; i++) {
printf("%d\t", i + 1);
int j;
for (j = i; j < x; j++) {
printf("* ");
}
printf("\n");
}
return EXIT_SUCCESS;
}
這裡使用了結構體Location,並生成了一個實例location.通過scanf向x、y輸入數字。以location.x = x;方式將數值賦值給結構體location的變量x.由此可以看出結構體就是現在面向對象的基礎,尤其是數據對象的前身。
我們希望打印操作能夠獨立出來,成為一個函數,可以這麼寫:
// 聲明函數
void print(int x, int y);
c是面向過程的計算機語言,要在主函數內調用其他函數,必須要在主函數前聲明函數,要麼就直接把函數按照調用次序逆次由上到下排序。即便是面向對象的C++,也是如此。
/**
* 倒三角打印
*/
void print(int x, int y) {
int i;
for (i = 0; i < y; i++) {
printf("%d\t", i + 1);
int j;
for (j = i; j < x; j++) {
printf("* ");
}
printf("\n");
}
/**
* 倒三角打印
*/
void print(int x, int y) {
int i;
for (i = 0; i < y; i++) {
printf("%d\t", i + 1);
int j;
for (j = i; j < x; j++) {
printf("* ");
}
printf("\n");
}
整體代碼如下:
#include <stdio.h>
#include <stdlib.h>
/**
* 定義一個結構體
*/
struct Location {
int x; // 橫坐標
int y; // 縱坐標
} location;
// 聲明函數
void print(int x, int y);
int main(void) {
printf("輸入X坐標:\t\n");
int x;
scanf("%d", &x);
location.x = x;
printf("輸入Y坐標:\t\n");
int y;
scanf("%d", &y);
location.y = y;
printf("X坐標是:\t%d\n", location.x);
printf("Y坐標是:\t%d\n", location.y);
// 做倒三角打印
print(x, y);
return EXIT_SUCCESS;
}
/**
* 倒三角打印
*/
void print(int x, int y) {
int i;
for (i = 0; i < y; i++) {
printf("%d\t", i + 1);
int j;
for (j = i; j < x; j++) {
printf("* ");
}
printf("\n");
}
}
對比C++的代碼:
#include <iostream>
using namespace std;
// 定一個類
class Location {
private:
int x; // 橫坐標
int y; // 縱坐標
public:
Location() {
}
Location(int x, int y) {
this->x = x;
this->y = y;
}
int getX() {
return x;
}
void setX(int x) {
this->x = x;
}
int getY() {
return y;
}
void setY(int y) {
this->y = y;
}
};
int main() {
// 聲明
Location location;
cout << "輸入X坐標:\t";
int x;
cin >> x;
location.setX(x);
cout << "輸入Y坐標:\t";
int y;
cin >> y;
location.setY(y);
cout << "X坐標是:\t" << location.getX() << endl;
cout << "Y坐標是:\t" << location.getY() << endl;
// 做倒三角打印
int i;
for (i = 0; i < y; i++) {
cout << i + 1 << "\t";
int j;
for (j = i; j < x; j++) {
cout << "* ";
}
cout << endl;
}
return 0;
}
這裡的location就是一個類Location的實例了。同樣是賦值操作,對x賦值調用location.setX(x);方法,而內部實現是this->x = x;明顯的指針特色->而不是。。這個時候有了私有變量的概念,上面C的代碼中的location.x就不合適了。必須使用location.getX()方法輸出x的值。仍然讓我使用起來不舒服的是cin 與 cout ,為什麼在C++面向對象的語言裡,卻不能以方法的方式實現,還是要使用這樣的特定的字符串來(>> 與 <<)控制呢?真的很別扭。特別是在熟悉Java的實現後,你會覺得C++有的時候很別扭。如果我要重新定義一個公有的方法,除了上述的方式,可以這樣做:
#include <iostream>
using namespace std;
class Location {
private:
int x, y;
public:
Location() {
}
Location(int x, int y);
int getX() {
return x;
}
void setX(int x) {
this->x = x;
}
int getY() {
return y;
}
void setY(int y) {
this->y = y;
}
};
Location::Location(int x, int y) {
this->x = x;
this->y = y;
}
// 省略
現在類中定義方法Location(int x, int y);然後在類外實現該方法:
Location::Location(int x, int y) {
this->x = x;
this->y = y;
}
上述是一個構造方法,如果要返回值的值類型要定義在方法最前面,如:
int Location::getX() {
return y;
}
我們把打印操作改成函數實現,注意:在C++裡如果一個函數被高頻度執行,聲明為內聯函數(inline),可以提高執行效率!
// 聲明函數
inline void print(int x, int y);
C++一樣沒有跳出C的特色,要在主函數調用前聲明函數。
/**
* 倒三角打印
*/
inline void print(int x, int y) {
int i;
for (i = 0; i < y; i++) {
cout << i + 1 << "\t";
int j;
for (j = i; j < x; j++) {
cout << "* ";
}
cout << endl;
}
}
給出全部代碼:
#include <iostream>
using namespace std;
/**
* 定義一個類
*/
class Location {
private:
int x; // 橫坐標
int y; // 縱坐標
public:
Location() {
}
Location(int x, int y) {
this->x = x;
this->y = y;
}
int getX() {
return x;
}
void setX(int x) {
this->x = x;
}
int getY() {
return y;
}
void setY(int y) {
this->y = y;
}
};
// 聲明函數
inline void print(int x, int y);
int main() {
// 聲明
Location location;
cout << "輸入X坐標:\t";
int x;
cin >> x;
location.setX(x);
cout << "輸入Y坐標:\t";
int y;
cin >> y;
location.setY(y);
cout << "X坐標是:\t" << location.getX() << endl;
cout << "Y坐標是:\t" << location.getY() << endl;
// 做倒三角打印
print(x, y);
return 0;
}
/**
* 倒三角打印
*/
inline void print(int x, int y) {
int i;
for (i = 0; i < y; i++) {
cout << i + 1 << "\t";
int j;
for (j = i; j < x; j++) {
cout << "* ";
}
cout << endl;
}
}
學過Java的人覺得很別扭。呵呵,我也一樣。
最後,讓我們看看這2個程序的最終輸出:
console代碼
輸入X坐標: 9
輸入Y坐標: 9
X坐標是: 9
Y坐標是: 9
1 * * * * * * * * *
2 * * * * * * * *
3 * * * * * * *
4 * * * * * *
5 * * * * *
6 * * * *
7 * * *
8 * *
9 *
換成Java實現:
Java代碼:
import javax.swing.JOptionPane;
public class Location {
private int x;
private int y;
/**
* @return the x
*/
public int getX() {
return x;
}
/**
* @param x
* the x to set
*/
public void setX(int x) {
this.x = x;
}
/**
* @return the y
*/
public int getY() {
return y;
}
/**
* @param y
* the y to set
*/
public void setY(int y) {
this.y = y;
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Location location = new Location();
int x = Integer.parseInt(JOptionPane.showInputDialog("輸入X坐標:"));
int y = Integer.parseInt(JOptionPane.showInputDialog("輸入Y坐標:"));
location.setX(x);
location.setY(y);
location.print(x, y);
}
/**
* 倒三角打印
*
* @param x
* @param y
*/
public void print(int x, int y) {
for (int i = 0; i < y; i++) {
System.out.print(i + 1 + "\t");
for (int j = i; j < x; j++) {
System.out.print("* ");
}
System.out.println();
}
}
}
呵呵,用Java實現,感覺就是好!