*************
C++
topic:結構
*************
Structure is a very intersting issue. I really don't like concepts as it is boring. I would like to cases instead. If I want to learn something, donot hesitate to make shits.?
Like building a house. When I was at school my dream is to bought a flat in the very top of the building. I stand by the big floor-to-ceiling window watching outside, colourful and busy. The traffic flows and shining neon are the breathes of the city. It has no relation with the structure of the code so forget it. When building the house, structure always comes significant.
Then add some elements and it will superise you.
?
So I will do some shit first. Here is the beginning of the caculator.
#include <iostream> // 包含輸入輸出流庫int main()
{ // 主函數,程序的起點return 0; // 程序正常結束
}
So think about the work flow, which is the structure of the code.
- 提示用戶輸入兩個整數。
- 讀取用戶輸入,并檢查輸入是否有效。
- 如果輸入無效,給出錯誤提示。
- 計算加法和減法的結果。
- 輸出結果。
And the first thing is input twonumbers:
#include <iostream>int main()
{"請輸入第一個整數: ";"請輸入第二個整數: ";return 0;
}
?
Introduce the new friend, namespace. Pay special attention to the line here. Every time the line comes first, a new friend comes second.
namespace 就是 避免命名沖突,舉個例子,我叫“ElseWhereR”,在‘學校’這個命名空間,ElseWhereR是校草。在‘公司’這個命名空間中,ElseWhereR是董事長。ElseWhereR是同一個人,但是在不同的命名空間中可以獨立,不會互相干擾。
我寫的第一個程序,hello world:
#include <iostream>int main() {std::cout << "Hello, World!" << std::endl;return 0;
}
![]() |
?
But, 我在抄這段代碼的時候, std:: 這個我要經常寫,非常的繁瑣。這個時候就要介紹 namespace這個非常友好的朋友了。這個的作用就是告訴程序,我要自己起名字了。這個的用法如下:
using namespace xjbName;
如果將這項黑科技用在代碼中,?在 C++ 中,標準庫的所有符號(如 cout
、cin
等)都包含在 std
命名空間中。但是值得注意的是,namespace的名字是可以隨便取的, using 也是可以省略的。
#include <iostream>
using namespace std;int main() {cout << "Hello, World!" << endl;return 0;
}
經常寫代碼的都知道,需要告訴計算機數字的類型,這里直接 int,整數的意思:
#include <iostream>int main() {int num1, num2;std::cout << "請輸入第一個整數: ";std::cin >> num1;std::cout << "請輸入第二個整數: ";std::cin >> num2;int sum = num1 + num2;int difference = num1 - num2;std::cout << "加法結果: " << sum << std::endl;std::cout << "減法結果: " << difference << std::endl;return 0;
}
std::cout <<
std::cin >>
標準用法,完整意思是:
standard:: control output <<
standard:: control intput >>
兩個冒號代表,cout屬于std里面的一個成員。
注意,開始實戰。
將命名空間和主函數分開。這個是一個很好的習慣。
- 命名空間內代碼:可以將具體的功能實現和數據定義組織在一起,方便維護和優化相關功能。
- 主函數:保持簡潔,只負責程序的啟動和核心流程控制,使得代碼結構清晰。
進一步保持代碼的優雅,可以將命名空間中的代碼實現方法分離出來。
命名空間只定義變量的類型:
#include <iostream>// 定義命名空間 JiSuanQi
namespace JiSuanQi
{// 定義兩個整數變量int num1, num2;
}
接下來,寫一個函數,實現求和、求差的實現方法:
// 定義命名空間 JiSuanQi
namespace JiSuanQi
{// 定義兩個整數變量int num1, num2;
}// 在命名空間外實現函數 calculate
void calculate()
{int sum = JiSuanQi::num1 + JiSuanQi::num2;int difference = JiSuanQi::num1 - JiSuanQi::num2;std::cout << "加法結果: " << sum << std::endl;std::cout << "減法結果: " << difference << std::endl;
}
這里,void是固定格式,表示不返回任何東西,只是執行一些操作。
最后,寫出主程序。
#include <iostream>// 定義命名空間 JiSuanQi
namespace JiSuanQi
{// 定義兩個整數變量int num1, num2;
}// 在命名空間外實現函數 calculate
void calculate()
{int sum = JiSuanQi::num1 + JiSuanQi::num2;int difference = JiSuanQi::num1 - JiSuanQi::num2;std::cout << "加法結果: " << sum << std::endl;std::cout << "減法結果: " << difference << std::endl;
}// 主函數
int main()
{using namespace JiSuanQi;std::cout << "請輸入第一個整數: ";std::cin >> num1;std::cout << "請輸入第二個整數: ";std::cin >> num2;calculate();return 0;
}
最后輸出的結果是:
![]() |
還有一個好玩的,如果另一個程序也想使用加減法,但是他不想再寫一遍函數,那么就需要使用 類。既然外部文件想使用這個方法,那么就得定義這個構造函數為 public。
#include <iostream>// 定義命名空間 JiSuanQi
namespace JiSuanQi
{// 定義類 Calculatorclass Calculator{public:int num1; // 第一個整數int num2; // 第二個整數// 構造函數Calculator(int a, int b) : num1(a), num2(b) {}// 計算加法和減法void calculate() const{int sum = num1 + num2;int difference = num1 - num2;std::cout << "加法結果: " << sum << std::endl;std::cout << "減法結果: " << difference << std::endl;}};
}
值得注意的是,構造函數的名字,和類的名字得保持一致。如果不一致,會發生編譯錯誤。
這里的一個語法知識,用來初始化:
Calculator(int a, int b)
:這是一個 構造函數,其作用是初始化類Calculator
的對象。- 參數列表
(int a, int b)
表示該構造函數接受兩個整數參數a
和b
。
: num1(a), num2(b)
:這是 初始化列表,用于在創建對象時初始化類的成員變量。??num1(a)
表示將成員變量num1
的值初始化為參數a
。num2(b)
表示將成員變量num2
的值初始化為參數b
。
{}
:表示構造函數的函數體。在這個例子中,函數體為空,因為所有的初始化工作都已經在初始化列表中完成。即使為空,花括號也不能省略。
?
如果你只希望別的程序調用你的計算,你想把num1和num2保護起來,那就加一個 private。
#include <iostream>// 定義命名空間 JiSuanQi
namespace JiSuanQi
{// 定義類 Calculatorclass Calculator{private:int num1; // 第一個整數int num2; // 第二個整數public:// 構造函數Calculator(int a, int b) : num1(a), num2(b) {}// 計算加法和減法void calculate() const{int sum = num1 + num2;int difference = num1 - num2;std::cout << "加法結果: " << sum << std::endl;std::cout << "減法結果: " << difference << std::endl;}};
}
主函數只要進行一點點改變就OK:
#include <iostream>// 定義命名空間 JiSuanQi
namespace JiSuanQi
{// 定義類 Calculatorclass Calculator{private:int num1; // 第一個整數int num2; // 第二個整數public:// 構造函數Calculator(int a, int b) : num1(a), num2(b) {}// 計算加法和減法void calculate() const{int sum = num1 + num2;int difference = num1 - num2;std::cout << "加法結果: " << sum << std::endl;std::cout << "減法結果: " << difference << std::endl;}};
}// 主函數
int main()
{int num1, num2;std::cout << "請輸入第一個整數: ";std::cin >> num1;std::cout << "請輸入第二個整數: ";std::cin >> num2;// 使用命名空間 JiSuanQi 中的 Calculator 類JiSuanQi::Calculator calc(num1, num2);calc.calculate();return 0;
}
在實際的工作中,類只進行計算,職責單一化。
#include <iostream>// 定義命名空間 JiSuanQi
namespace JiSuanQi
{// 定義類 Calculatorclass Calculator{public:// 構造函數Calculator(int a, int b) : num1(a), num2(b) {}// 計算加法和減法void calculate(){sum = num1 + num2;difference = num1 - num2;}
}
那么,怎么獲取計算結果呢?
int getSum() { return sum; }
-
int getSum()
:-
這是一個成員函數聲明。
-
返回類型是
int
,表示該函數返回一個整數值。 -
函數名是
getSum
,表示該函數用于獲取某個值。
-
-
{ return sum; }
:-
函數體。
-
表示該函數的實現是直接返回成員變量
sum
的值。
-
老鳥程序員會使用 constant,這個是固定搭配,記住只引用不改變:
#include <iostream>// 定義命名空間 JiSuanQi
namespace JiSuanQi
{// 定義類 Calculatorclass Calculator{public:// 構造函數Calculator(int a, int b) : num1(a), num2(b) {}// 計算加法和減法void calculate(){sum = num1 + num2;difference = num1 - num2;}// 獲取計算結果int getSum() const { return sum; }int getDifference() const { return difference; }private:int num1; // 第一個整數int num2; // 第二個整數int sum; // 加法結果int difference; // 減法結果};
}
主函數需要?使用命名空間 JiSuanQi 中的 Calculator 類。注意,主函數在使用類中的構造函數的時候,需要對構造函數聲明一個對象。具體的在 函數 中有講到。
C++ 函數-CSDN博客https://blog.csdn.net/ElseWhereR/article/details/145371006?spm=1001.2014.3001.5501
#include <iostream>// 定義命名空間 JiSuanQi
namespace JiSuanQi
{// 定義類 Calculatorclass Calculator{public:// 構造函數Calculator(int a, int b) : num1(a), num2(b) {}// 計算加法和減法void calculate(){sum = num1 + num2;difference = num1 - num2;}// 獲取計算結果int getSum() const { return sum; }int getDifference() const { return difference; }private:int num1; // 第一個整數int num2; // 第二個整數int sum; // 加法結果int difference; // 減法結果};
}// 主函數
int main()
{int num1, num2;std::cout << "請輸入第一個整數: ";std::cin >> num1;std::cout << "請輸入第二個整數: ";std::cin >> num2;// 使用命名空間 JiSuanQi 中的 Calculator 類JiSuanQi::Calculator calc(num1, num2);calc.calculate();// 在類外部輸出結果std::cout << "加法結果: " << calc.getSum() << std::endl;std::cout << "減法結果: " << calc.getDifference() << std::endl;return 0;
}
對象調用構造函數,只需要加個 . 就OK。
calc.calculate();
一般來說,在一個項目中,將 類的定義?和 類的實現 放在同一份文件中,也就是 頭文件。
我將類的定義和類的實現保存為?Calculator.h 文件:
#ifndef CALCULATOR_H
#define CALCULATOR_H
#include <iostream>namespace JiSuanQi {class Calculator {public:// 構造函數Calculator(int a, int b) : num1(a), num2(b) {}// 計算加法和減法void calculate() {sum = num1 + num2;difference = num1 - num2;}// 獲取計算結果int getSum() const { return sum; }int getDifference() const { return difference; }private:int num1; // 第一個整數int num2; // 第二個整數int sum; // 加法結果int difference; // 減法結果};
}#endif // CALCULATOR_H
那么這個天才的計算邏輯如果斯嘉麗也想使用,那么她在寫代碼的時候,只需要加上一句話:
#include "Calculator.h"int main() {int num1, num2;std::cout << "請輸入第一個整數: ";std::cin >> num1;std::cout << "請輸入第二個整數: ";std::cin >> num2;// 創建 Calculator 對象并調用方法JiSuanQi::Calculator calc(num1, num2);calc.calculate();// 輸出結果std::cout << "加法結果: " << calc.getSum() << std::endl;std::cout << "減法結果: " << calc.getDifference() << std::endl;return 0;
}
很棒,我大概理解C++的邏輯了。
新年快樂。? ? ? ? ? ? ? ??