電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
[求助](C++)我還是不太理解const,void,return

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式初級班:語法及基礎概念
上一篇主題 :: 下一篇主題  
發表人 內容
gamer15
對這略感興趣的新人


註冊時間: 2009-12-06
文章: 27

318.45 果凍幣

發表發表於: 2010-8-15, PM 9:51 星期日    文章主題: [求助](C++)我還是不太理解const,void,return 引言回覆

有沒有人願意說明一下
書上大概是說只要加上了const的function
該function的計算就完全不會影響裡面的變數的值
但是沒有給一個很明白的例子

我想問比如說某個名為a的function:

int x = 5
void a() const{
x -= 1;
std::cout << x;
}

int main(){
a();
std::cout << x;
}

在main中的a()會顯示x的值為4,而下一行的x則會顯示5.對嗎?


void加在function前,則該function的計算結果不會回傳給該function對嗎?
而不加void的就必須加return回傳一個值給其計算對嗎?

請前輩們指教了
回頂端
檢視會員個人資料 發送私人訊息
yag
Site Admin


註冊時間: 2007-05-02
文章: 684

2639.56 果凍幣

發表發表於: 2010-8-16, AM 11:35 星期一    文章主題: 引言回覆

嗯…這好難解說啊

基本上你的程式碼是不能通過compile的
void a() const是不合法的寫法
const要放在後面的話,只能是類別裡的成員函式
其意義與其說是「該function的計算就完全不會影響裡面的變數的值」
不如說是「如果在該function中改變了成員變數的值,則無法通過compile」
代碼:
#include <iostream>
using namespace std;

int g_iVar = 1;   // global

class A{
public:
   int m_iVar;   // member

   A() { m_iVar = 2; }

   void func( int iArg ) const   // argument
   {
      int l_iVar = 4;   // local
      g_iVar = 5;
      m_iVar = 6;   // 這行會不能通過compile
      iArg   = 7;
      l_iVar = 8;
   }
};

int main()
{
   A a;
   a.func( 3 );
   return 0;
}


另外你的main的回傳值型態是int
但你並沒有return任何東西
這個也是過不了compile的

return不是傳值給該function
而是傳值給呼叫該function的地方
比如說
代碼:
#include <iostream>
using namespace std;
int a() { return 1; }
int main()
{
    int b = a();
    cout << b;
    return 0;
}

則輸出的b的值會是1
因為b接收到a函式return的1

不管你回傳值型態是什麼,你總是要return個東西
但有時你並不想return什麼,函式裡直接就把功能做掉了
那就可以用void來代表你沒什麼要回傳
代碼:
#include <iostream>
using namespace std;
void a() { cout << 1; }
int main()
{
    a();
    return 0;
}

像這樣,a函式裡直接輸出1到螢幕,它沒什麼需要回傳的
那就把回傳值型態設成void就行了
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
gamer15
對這略感興趣的新人


註冊時間: 2009-12-06
文章: 27

318.45 果凍幣

發表發表於: 2010-8-16, PM 8:04 星期一    文章主題: 引言回覆

這麼說的話
也就是在const之下任何會改變該Class的成員變數的計算全都會無法通過編譯
這樣一來某Class的a對成員變數x做出了改變便會在編譯出錯?

另外說"const要放在後面的話",是說也能放在前方了?
是不是像這樣 const int x = 5
這樣子是不是 x = 5 是定數無法改變,代入其他值了?
回頂端
檢視會員個人資料 發送私人訊息
teshuva
稍嫌羞澀的路人


註冊時間: 2011-12-08
文章: 4

62.97 果凍幣

發表發表於: 2011-12-8, PM 9:25 星期四    文章主題: 引言回覆

gamer15 寫到:
這麼說的話
也就是在const之下任何會改變該Class的成員變數的計算全都會無法通過編譯
這樣一來某Class的a對成員變數x做出了改變便會在編譯出錯?

另外說"const要放在後面的話",是說也能放在前方了?
是不是像這樣 const int x = 5
這樣子是不是 x = 5 是定數無法改變,代入其他值了?



其實並不是你想像中的那樣…
簡單的說:
const 指的是constant 也就是常態
void 指…(不知道怎麼描述)
return 指的是回傳

在你的程式碼中,首先const 是不能放在 void int a 之後的


我覺得我一個一個回好了

先回答你的問題

另外說"const要放在後面的話",是說也能放在前方了?
是不是像這樣 const int x = 5
這樣子是不是 x = 5 是定數無法改變,代入其他值了?

我學習的時候,老師並沒有說能夠放在後面…(老師很有趣的說:沒有女生喜歡男人走後門的…(汗))
不過我們在寫的程式碼都是 const int x = 5
而這裡的 x 的屬性是 int 也就是整數
在一開始我們這樣子宣告(declare)的原因,大多是因為程式所需要(真是廢話)

但是並不代表x 永遠就都是5,這裡的宣告只是當程式一開始執行(run)時,x 的數值是5,而屬性是整數(不含小數點)

也就是說…如果你的程式碼是

const int x = 5.5

cout << x;
你看到的 x數值是~~~~5.5~~~才怪
因為它並不是 double,所以是不會出現 ".5" 的
不知道這樣子解說你明不明白呢?
回頂端
檢視會員個人資料 發送私人訊息
teshuva
稍嫌羞澀的路人


註冊時間: 2011-12-08
文章: 4

62.97 果凍幣

發表發表於: 2011-12-8, PM 9:39 星期四    文章主題: Re: [求助](C++)我還是不太理解const,void,return 引言回覆

gamer15 寫到:
有沒有人願意說明一下
書上大概是說只要加上了const的function
該function的計算就完全不會影響裡面的變數的值
但是沒有給一個很明白的例子

我想問比如說某個名為a的function:

int x = 5
void a() const{
x -= 1;
std::cout << x;
}

int main(){
a();
std::cout << x;
}

在main中的a()會顯示x的值為4,而下一行的x則會顯示5.對嗎?


void加在function前,則該function的計算結果不會回傳給該function對嗎?
而不加void的就必須加return回傳一個值給其計算對嗎?

請前輩們指教了



關於你的問題,我試著說明,如果說錯的地方還請其他大大幫忙
小弟很久沒碰c++囉

…這之前會有 function 這一段的宣告…

int x = 5 <===物件 x 的宣告 (int = 整數;數值為 5) 也可以分成兩段,這是題外話
void a() const{ <=== 應該是寫成 const void a(),void 可以簡單的說就是執行程式碼而不回傳任何數值,而return則是在執行以後,必須回傳1個值(也只能夠是一個)
x -= 1; <===由於x的預設值是 5,x -= 1 是快速寫法,還原以後是 x = x - 1
std::cout << x; <===輸出x值,這時候的x會是 4,因為上面的x被減掉1了
}

int main() <===main 是指主程式,所以是從這邊開始執行的
{
a(); <===執行 a 指令(請見上面)
std::cout << x; <===輸出 x 值,也可以寫成 cout << x;
}

輸出結果為
45

為什麼不是
4
5
呢?

是因為在a指令中,你並沒有在輸出中放入 "endl" 這個指令
你的程式碼是 "std::cout << x;"
c++ 是個忠厚老實的鄉下人,你說向東它絕不會向西~~(其他程式也是一樣啦…)
如果你的程式碼是
cout << x << endl;
這樣子就會輸出結果就會是
4
5

再說清楚一點…
在程式執行完a指令以後,它的指標停留在同一行,也就是輸出4的那一行列,接著輸出5,所以才會變成 "45"

補充說明一下…
endl 指的是 end line,也就是說結束這一行,那程式就會自動跳到下一行,然後從頭開始囉

我記得有一個指命是 回到最前面…不過忘了是什麼~~呵呵呵

如果說的不對的地方,請大家多多指正,大家一起學習^^
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式初級班:語法及基礎概念 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作