(二十)QT专题-值类型

Java和C#的主要区别在于两者的值类型(value type)和引用类型(reference type)的不同。

  • 值类型适用于基本类型,如char、int 和 float,还有C#的structs。区分它们的主要特征在于创建它们时并不需要使用new。还有,在执行赋值运算时会对变量持有者进行复制。例如:
int i = 5;
int j = 10;
i = j;
  • 引用类型适用于一些类,比如Integer(在Java中)、String和MyVeryOwnClass。实例是通过new创建的。执行赋值运算符时,只是对指向这个对象的引用的复制。要想获得深度复制(deep copy)的效果,必须调用函数clone() (在Java中)或者Clone() (在C#中)。例如:
Integer i = new Integer(5);
Integer j = new Integer(10);
i = j.clone();

在C++中,所有类型都可以用作“引用类型”,并且那些具有可复制性的类型也还可以用作“值类型”。例如,C++不需要任何Integer类,因为我们可以像下面这样使用指针和new:

int *i = new int(5);
int *j = new int(10);
*i = *j;

不像Java和C#,C++会像对待内置类型一样对待用户自定义的类:

Point2D *i = new Point2D(5, 5);
Point2D *j - new Point2D(10, 10);
*i = *j;

如果想让某个C++类具备可复制性,那么必须确保类有一个复制构造函数(copy constructor)和一个赋值运算符。当用同一种类型的对象初始化另外一个对象时,就会调用复制构造函数。对于这一操作,C++提供了两种等价的语法:

Point2D i(20, 20);

Point2D j(i);    //first syntax
Point2D k=i;   //second syntax

当在一个已经存在的变量上调用赋值运算符的时候,就会调用该赋值运算符:

Point2D i(5, 5);
Point2D j(10, 10);
j = i;

在定义一个类时,C++编译器会自动提供一个复制构造函数和一个赋值运算符,以用于执行成员到成员的复制。对于这个Point2D类,这样做就相当于在这个类的定义下写下了下列代码:

class Point2D
{
 public:
  ...
  Point2D(const Point2D &other)
    : xVal(other.xVal),yVal(other.yVal){ }
  Point &operator=(cosnt Point2D &other){
    xVal = other.xVal;
    yVal = other.yVal;
    return *this;
  }
  ...
private:
  double xVal;
  double yVal;
};

对于某些类,默认的复制构造函数和赋值运算符可能都不够用。比如当这些类使用的是动态内存时,通常就会出现这种情形。要让该类具有可复制特性,就必须自己实现它的复制构造函数和赋值运算符。
对于一些不必具有可复制特性的类,可以通过让复制构造函数和赋值运算符成为私有(private)类型而禁用它们。如果随后不小心试图去复制该类的实例,那么编译器就会报错。例如:

class BankAccount
{
public:
  ...
private:
  BankAccount(const BankAccount &other);
  BankAccount &operator = (const BankAccount &other)
};

在Qt中,许多类都被设计用在值类(value class)。它们都有一个复制构造函数和一个赋值运算符,并且通常可以在没有new的堆栈上对它们进行实例化。用于这方面的例子有QDataTime、QImage、QString类和容器类,如QList<T>、QVector<T>和QMap<K,T>。
还有其他的一些类可以归入“引用类型”的范畴中,特别是QObject以及它们的子类(如QWidget、QTimer、QTcpSocket,等等)。这些类都有虚函数、并且也都不能被复制。例如,一个QWidget表示一个具体的窗口或者屏幕上的一个控件。如果内存中有75个QWidget的实例,那么屏幕上也就有75个窗口或者控件。这些类通常都使用new操作符来实例化。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容