查看完整版本: C++物件導向的一些問題
頁: [1]

immortal8305 發表於 2011-9-3 08:55 AM

C++物件導向的一些問題

看了書之後還是不太懂



1.請問什麼是inline函式?用inline有什麼好處?

2.this指標到底能幹麻

竟然是指向自己

那為什麼不寫出自己的變數名子就好了?<div></div>

GravitationX 發表於 2011-9-3 02:25 PM

本帖最後由 GravitationX 於 2011-9-3 02:40 PM 編輯

回復 1# immortal8305


1. inline類似MACRO(巨集),但又不是完全一樣,舉個例子比較清楚:
#include <iostream>

inline int add(int a, int b)
{
    return a+b;
}

int main()
{
    int a = 3, b = 4;
    std::cout << add(a, b);
}如果編譯器採納add函式成為inline,那麼在主程式裡面的add函式將被展開。
函式展開的好處是可以稍微增加效率,減少呼叫函式的成本。缺點是會增加程式的大小。
注意!不是每一個函式都能被編譯器採納成為inline function。

2. this的用途主要是防止遮蔽問題,看個例子比較清楚:class SimpleComplex
{
public:
    SimpleComplex() : real(0), imaginary(0) {}

    void SetComplex(double real, double imaginary)
    {
        SetReal(real);
        SetImaginary(imaginary);
    }

    void SetReal(double real)
    {
        this.real = real;
    }

    double GetReal() { return real; }

    void SetImaginary(double imaginary)
    {
        this.imaginary = imaginary;
    }

    double GetImaginary() { return imaginary; }

private:
    double real;
    double imaginary;
};在setter很明顯會有遮蔽問題,參數列會遮蔽class本身的member,不用this的話會出問題。
method也可能會有遮蔽問題。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

iseeyou 發表於 2011-9-5 09:47 AM

本帖最後由 iseeyou 於 2011-9-5 10:02 AM 編輯

this 主要不是為了遮蔽問題. 且你的用法也寫錯. 既然他叫指標當然是要寫成
this->imaginary=imaginary;
遮蔽問題可改變參數名稱. 可是下面的問題, 沒this 真的無法辦到

this 主要目地真的是為了參考到自己. 什麼時後會用到.
如把自己傳給令一個function 使用. 這時沒this 指標跟本不可能達到.
或是把自己回傳給別人用.  C++ 中復寫 operator=() 就會用到this 指標回傳自己

或是把自己設給另一個變數也要用到this

example
class A;
void AddTen(A& a);
class A
{
public:
  int i;
  void Fn()
  {
    // 透過AddTen 把 i +10
      AddTen(*this);  // 沒有this 指標下.. 怎麼把自己傳給別人
  }
};
void AddTen(A& a)
{
   a.i+=10;
}
operator = 的例子
class A
{
public:
A() : q(new int) , s(100) {}
A(const A& r) : q(new int),s(r) { }
~A() { delete [] q; }
A& operator=(const A& r)
{
    delete [] q;
    s= r.s;
    q=new int;
    return *this;  // 沒有this 指標, 怎麼把自己回傳
}
private :
   int s;
   int *q;
};
把自己設給某個變數的利子
class SimpleComplex
{
   public:
   SimpleComplex operator+(const SimpleComplex& r) const
   {
        SimpleComplex t;
        t=*this; // 把自己設給某個變數
        t.real+=r.real
        t.imaginary+=r.imaginary;
        return t;
   }

private:
  double real;
  dobule imaginary;
};
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

wumz 發表於 2011-9-8 03:09 AM

我來加幾句自己的意見:

"自己" 這個問題要在有使用物件導向的情況下討論才有意義。
當你用class作出多數的instance (物件) 的時候,每個物件都有自己的
attribute (資料)。平常的函數寫法,在不使用 this 的情況下,對自我
的資料是不了解的。

換句話說,在沒有用 this 的情況下,有用物件導向跟沒有用物件導向,
其實是一樣的,因為函數在沒有指定pointer (指定對像)的情況下,並
無法讀寫物件自己的資料,所以才會說都是一樣的。

講到底,this 是物件導向的基石之一,主要是用來指定 "自己這個" 物件
的位址,好方便自己或其他物件 讀寫 "自己這個"物件的資料。

例子就不放了,上面的例子我想應該是夠了...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁: [1]