C++类
C++
C 结构体 与 C++ 类的对比
编辑
struct
class
聚合类
编辑聚合类是一种没有用户定义的构造函数,
struct C
{
int a;
double b;
};
struct D
{
int a;
double b;
C c;
};
// initialize an object of type C with an initializer-list
C c = { 1, 2 };
// D has a sub-aggregate of type C. In such cases initializer-clauses can be nested
D d = { 10, 20, { 1, 2 } };
POD 结构
编辑struct
C结构与C++ POD结构共有 的 属性
编辑
声明 和 使用
编辑
C++ public:
private:
protected:
说明
基本 声明 和成 员变量
编辑
类和结构class
struct
。
struct person
{
string name;
int age;
};
|
class person
{
public:
string name;
int age;
};
|
person
,其name
age
。
person
person
类型
#include <iostream>
#include <string>
using namespace std;
class person
{
public:
string name;
int age;
};
int main ()
{
person a, b;
a.name = "Calvin";
b.name = "Hobbes";
a.age = 30;
b.age = 20;
cout << a.name << ": " << a.age << endl;
cout << b.name << ": " << b.age << endl;
return 0;
}
执行
Calvin: 30 Hobbes: 20
成 员函数
编辑
this
person
类型
class person
{
std::string name;
int age;
public:
person() : age(5) { }
void print() const;
};
void person::print() const
{
cout << name << ";" << this->age << endl;
/* "name"和 "age"是 成 员变量 。
"this"关键字 的 值是被 调用对象的 地 址 。其类型 为
const person*,原因 是 该函数 被 声明 为const。
*/
}
print()
::
name
age
print()
print()
,输出
a.print();
b.print();
a
b
print()
继承
编辑class P
{
int x;
};
class C : public P
{
int y;
};
P
P* p
+----+ |P::x| +----+ ↑ p
C
P* p
+----+----+ |P::x|C::y| +----+----+ ↑ p
P
对象C
对象P
C
D
继承P1
P2
,D
P1
P2
关于
重 载运算 符
编辑
C++
另外,=
)。
integer
integer
struct integer
{
int i;
integer(int j = 0) : i(j) {}
integer operator*(const integer &k) const
{
return integer (i * k.i);
}
};
struct integer
{
int i;
integer(int j = 0) : i(j) {}
integer operator*(const integer &k) const;
};
integer integer::operator*(const integer &k) const
{
return integer(i * k.i);
}
const
const integer &k
const
const
*this
)。
而integer &k
&
)k
。[11]
二元可重载运算符
编辑operator
」*this
),而右
integer a = 1;
/* 這裡的 等號 是 其中一 種 二 元 運算 符 ,
我 們可利用 重 載 運算 符 (=)的 方式
來 提供 初 始 化 功 能 ,而左方 的 變數 i
就是類 物件 本身 ,右 方 的 數字 1則 是
傳 入 參 數 。 */
integer b = 3;
/* 變數 名字 跟類物件 內的變數 無關 */
integer k = a * b;
cout << k.i << endl; //輸出 3
| |
a + b
| |
以加 |
a += b
|
a - b
| |
以減 |
a -= b
|
a * b
| |
以乘 |
a *= b
|
a / b
| |
以除 |
a /= b
|
a % b
| |
以模 |
a %= b
|
| |
a < b
| |
a <= b
| |
a > b
| |
a >= b
| |
a != b
| |
a == b
| |
邏輯 AND | a && b
|
邏輯 OR | a || b
|
| |
a << b
| |
以位 |
a <<= b
|
a >> b
| |
以位 |
a >>= b
|
a & b
| |
以位 |
a &= b
|
a | b
| |
以位 |
a |= b
|
a ^ b
| |
以位 |
a ^= b
|
其它 | |
a = b
| |
逗號 | a , b
|
=
)
<
)>
)
一元可重载运算符
编辑*this
),而不-
)!
)
| |||
備注 | |||
---|---|---|---|
+a |
|||
++a |
|||
a++ |
|||
-a |
|||
--a |
|||
a-- |
|||
| |||
邏輯 |
!a |
||
| |||
~a |
|||
其它 | |||
*a |
|||
&a |
|||
(type) a |
回 傳 資料 型 態 operator運算 符 ()
而後
回 傳 資料 型 態 operator運算 符 (參 數 )
括 号 重 载
编辑
[]
)()
)。
回 傳 資料 型 態 operator[] (參 數 )
回 傳 資料 型 態 operator() (參 數 1,參 數 2, ...)
构造函数
编辑
person(string N, int A)
{
name = N;
age = A;
}
person(std::string N, int A) : name(N), age(A) {}
person(std::string N = "", int A = 0) : name(N), age(A) {}
person() : name(""), age(0) {}
构造person
类型
int main()
{
person r = person("Wales", 40);
r.print();
}
int main()
{
person r ("Wales", 40);
r.print ();
}
person()
{
std::cout << "Hello!" << endl;
}
person
变量
默 认构造 函数
编辑
class A { int b;};
//使用 括 号 创建对象
A *a = new A(); //调用默 认构造 函数 ,b会 被 初 始 化 为'0'
//不 使用 括 号 创建对象
A *a = new A; //仅分配 内 存 ,不 调用默 认构造 函数 ,b会 有 一个未知值
析构函数
编辑
一个析构函数是一个构造函数的逆,
~person()
{
cout << "I'm deleting " << name << " with age " << age << endl;
}
另外
int main()
{
person someone("Wales", 40);
someone.~person(); //此時會 輸出 一 次 "I'm deleting Wales with age 40"
return 0; //第 二 次 輸出 "I'm deleting with age 40"
}
/* 在 這裡,程 式 結束 時 會 自動 調 用 析構函數 ,
而person.name在 第 一次調用析構函數時已被清除,
但 person.age會 按編譯 器 而定,
沒 能 在 第 一次調用析構函數時清零。 */
构造函数 与 析构函数 的 相似 点
编辑
兩者 都和 聲明 所在 的 類別 有 相 同 的 名字 。若 未 宣告 ,兩者 都會 執行 預 設 的 行為 。意 即 類別 在 建立 或 刪除時 ,會 一同分配或刪除記憶體。對 衍生類別 (subclass)而言,在 基礎 類別 (superclass)的 建 構函式 執行 期間 ,衍生類別 的 建 構函式 還 未 執行 ;反 之 ,在 基礎 類別 的 解 構函式 執行 期間 ,衍生類別 的 解 構函式 已 執行 完 畢。兩 種 情況 下 ,都 無法 使用 在 衍生類別 宣告 的 變數 。
类模板
编辑
类模
属性
编辑
C++语法试图some_structure variable_name[size]
),而且
内 存 消耗
编辑
结构twonums
结构
struct twonums
{
int a;
int b;
};
这个结构
+----+----+ | a | b | +----+----+
struct bytes_and_such
{
char c;
char C;
short int s;
int i;
double d;
};
+-+-+--+--+--+--+--------+ |c|C|XX|s | i | d | +-+-+--+--+--+--+--------+
位 字 段
编辑
struct A
{
unsigned a:2; // 可 以存储0-3的 数字 ,占 据 一 个int前 2 bit的 空 间.
unsigned b:3; // 可 以存储0-7的 数字 ,占 据 之 后 3 bit的 空 间.
unsigned :0; // 移 动到下 一个内置类型的末尾
unsigned c:2;
unsigned :4; // 在 c和 d中 间加4bit的 空白
unsigned d:1;
unsigned e:3;
};
// 内 存 结构
/* 4 byte int 4 byte int
[1][2][3][4] [5][6][7][8]
[1] [2] [3] [4]
[a][a][b][b][b][][][] [][][][][][][][] [][][][][][][][] [][][][][][][][]
[5] [6] [7] [8]
[c][c][][][][][d][e] [e][e][][][][][][] [][][][][][][][] [][][][][][][][]
*/
按引用 传参
编辑
this关键字
编辑
complex& operator+=(const complex & c)
{
realPart += c.realPart;
imagPart += c.imagPart;
return *this;
}
参 见
编辑
參考
编辑
- ^ 1.0 1.1 ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §9 Classes [class] para. 4
- ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §8.5.1 Aggregates [dcl.init.aggr] para. 1
- ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §8.5.1 Aggregates [dcl.init.aggr] para. 2
- ^ What's this "POD" thing in C++ I keep hearing about?. Comeau Computing. [2009-01-20]. (
原始 内容 存 档于2009-01-19). - ^ Henricson, Mats; Nyquist, Erik. Industrial Strength C++. Prentice Hall. 1997. ISBN 0-13-120965-5.
- ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §9.2 Class members [class.mem] para. 12
- ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §9.2 Class members [class.mem] para. 14
- ^ 8.0 8.1 ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §9.2 Class members [class.mem] para. 17
- ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §18.1 Types [lib.support.types] para. 5
- ^ thiscall (C++). [2009-01-26]. (
原始 内容 存 档于2008-12-10). - ^ 跟
integer *k
不同 ,使用 符號 (*)只 會 傳 遞變數 地 址 ,而且只 能 利用 變數 地 址 操作 變數 本身 。
資料 來 源
编辑
- Cplusplus.com tutorial lesson 5.2(页面
存 档备份,存 于互联网档案 馆), accessed in January 2006 - Chan, S. "Tutorial on C++ and STL", Hong Kong, 2006
- Cplusplus.com tutorial lesson 2.5(页面
存 档备份,存 于互联网档案 馆), accessed in February 2006