语法

变量声明

直接声明的变量, 其赋值操作会产生值拷贝, 例如

QString b("some text");
QString a(b); int a = 10;
int b = a;

对于QList, QMap容器, 赋值操作是值拷贝, 例如下面的b变量会得到一份a的拷贝.

QStringList a({"aa", "bb", "cc"});
QStringList b = a;

需要注意的是, 如果QList<T> 里的T是自定义类型(结构体或者类), 这个类型必须实现深拷贝的构造方法, 否则使用QList::append() 方法赋值并非真正的值拷贝, 在append的对象跳出方法区后, 其内部的值会被回收. 对于无法实现深拷贝的类型, 应当使用 QList<T *> 的方式构造列表.

对于可变对象列表结构, 可以使用指针值方式, 这种方式方便对单个对象进行修改和释放操作

# recommended
QList<ClazzType *> list; # not recommended
QList<ClazzType> *list;

  

变量生命周期

直接使用赋值产生的变量, 因为其产生于栈区, 其生命周期仅在其所处的方法内, 当方法执行完毕, 这个变量会被自动回收.

使用new产生的变量, 不会因为方法结束而被回收, 需要显式delete. 与上一条结合, 如果使用赋值产生的变量是一个复杂对象, 对象内部的成员指针变量使用new进行了赋值, 这个指针所指向的内存并不会因为方法结束而回收, 需要在对象的析构方法中显式delete.

构造/析构

对于结构体和对象, 构造/析构方法结构是一样的, 对于复杂结构体和复杂对象, 需要层层编写对应的构造和析构方法. 对于指针变量, 一个好习惯是在构造时将其值赋值为0.

如果结构体/对象内只有值变量, 构造和析构方法可以为空, 只要存在指针变量, 就需要写析构方法. 在析构方法中要避免忘记delete, 避免越界delete, 例如

struct AccountObject {
QString user;
QString pass; AccountObject(){}
AccountObject(const AccountObject& a) :
user(a.user), pass(a.pass) {}
}; struct InboundHTTPConfigurationObject {
int timeout;
QList<struct AccountObject *> accounts;
bool allowTransparent;
int userLevel; InboundHTTPConfigurationObject(){}
InboundHTTPConfigurationObject(const InboundHTTPConfigurationObject& a) :
timeout(a.timeout), allowTransparent(a.allowTransparent), userLevel(a.userLevel) {
foreach(AccountObject *dummy, a.accounts) {
AccountObject *account = new AccountObject(*dummy);
accounts.append(account);
}
}
~InboundHTTPConfigurationObject() {
foreach(AccountObject *account, accounts) {
delete account;
}
}
}; struct StreamSettingsObject {
// "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic"
QString network;
// "none" | "tls"
QString security;
struct SockoptObject *sockopt;
struct TransportTlsObject *tlsSettings;
struct TransportTcpObject *tcpSettings;
struct TransportKcpObject *kcpSettings;
struct TransportWebSocketObject *wsSettings;
struct TransportHTTPObject *httpSettings;
struct TransportDomainSocketObject *dsSettings;
struct TransportQuicObject *quicSettings; StreamSettingsObject() : sockopt(0), tlsSettings(0), tcpSettings(0),
kcpSettings(0), wsSettings(0), httpSettings(0), dsSettings(0), quicSettings(0) {} StreamSettingsObject(const StreamSettingsObject& a) :
network(a.network), security(a.security), sockopt(0), tlsSettings(0), tcpSettings(0),
kcpSettings(0), wsSettings(0), httpSettings(0), dsSettings(0), quicSettings(0) {
if (a.sockopt) {
sockopt = new SockoptObject(*(a.sockopt));
}
if (a.tlsSettings) {
tlsSettings = new TransportTlsObject(*(a.tlsSettings));
}
if (a.tcpSettings) {
tcpSettings = new TransportTcpObject(*(a.tcpSettings));
}
if (a.kcpSettings) {
kcpSettings = new TransportKcpObject(*(a.kcpSettings));
}
if (a.wsSettings) {
wsSettings = new TransportWebSocketObject(*(a.wsSettings));
}
if (a.httpSettings) {
httpSettings = new TransportHTTPObject(*(a.httpSettings));
}
if (a.dsSettings) {
dsSettings = new TransportDomainSocketObject(*(a.dsSettings));
}
if (a.quicSettings) {
quicSettings = new TransportQuicObject(*(a.quicSettings));
}
} ~StreamSettingsObject() {
if (sockopt) delete sockopt;
if (tlsSettings) delete tlsSettings;
if (tcpSettings) delete tcpSettings;
if (kcpSettings) delete kcpSettings;
if (wsSettings) delete wsSettings;
if (httpSettings) delete httpSettings;
if (dsSettings) delete dsSettings;
if (quicSettings) delete quicSettings;
}
};

深拷贝

对于深拷贝, 可以用方法实现, 也可以直接使用构造函数, 可以参考上面的代码例子.

函数参数的类型

1. 值传递 func(ClazzType param) 此时会进行变量复制,在函数内部看到的param与外部调用时使用的param不是同一个对象。

2. 传递指针 func(ClazzType *param) 这时候传递的是param这个指针自身的值,在函数内部可以对指针所指向的ClazzType实例进行修改。

3. 传递引用 func(ClazzType &param) 此时传递的是param这个对象自身,避免了func(ClazzType param) 这种形式下的值复制,在函数内部修改param,等同于在外部直接修改。一种特殊用法就是在对象的构造函数中 ClazzType(const ClazzType& param), 避免变量复制,更加高效。

4. 返回引用 ClazzType& func(params... ) 这种函数返回的变量,必须是在函数外已经声明的变量,这种方式的好处是避免变量复制,不会产生返回值的副本。

关键词

const

explicit 在构造函数上使用此关键词,用于避免在类型对比时使用错误的隐式转换,

static 静态变量和静态方法

inline 内联方法将在编译时直接展开到调用处,但是是否使用内联是由编译器来决定的

QT & C++笔记的更多相关文章

  1. qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

    应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...

  2. Qt学习笔记-Widget布局管理

    Qt学习笔记4-Widget布局管理       以<C++ GUI Programming with Qt 4, Second Edition>为参考 实例:查找对话框 包含三个文件,f ...

  3. QT学习笔记(一)——Helloworld

    QT学习笔记(一)--Helloworld 一.调试的基本方法: Log调试法 --在代码中加入一定的打印语句 --打印程序状态和关键变量的值 断点调试法: --在开发环境中的对应代码行加上断点 -- ...

  4. Matlab+Qt开发笔记(一):matlab搭建Qt开发matlib环境以及Demo测试

    前言   做一些数据处理软件,使用matlab文件,.mat文件.   准备条件   安装matlab2016,发现是vs 12(是vs2011版本),Qt5.9.3是支持vs 14(是vs2015版 ...

  5. Qt 学习笔记 - 第三章 - Qt的三驾马车之一 - 串口编程 + 程序打包成Windows软件

    Qt 学习笔记全系列传送门: Qt 学习笔记 - 第一章 - 快速开始.信号与槽 Qt 学习笔记 - 第二章 - 添加图片.布局.界面切换 [本章]Qt 学习笔记 - 第三章 - Qt的三驾马车之一 ...

  6. Qt 学习笔记 - 第五章 - Qt 时间编程 - Qt 时钟

    原文地址:Qt 学习笔记 - 第五章 - Qt 时间编程 - Qt 时钟 Qt 学习笔记全系列传送门: Qt 学习笔记 - 第一章 - 快速开始.信号与槽 Qt 学习笔记 - 第二章 - 添加图片.布 ...

  7. QT学习笔记1

    不准备用MFC了,想切换到QT.所以跟着网上的一个笔记学习. 1 开发环境是VS2008+QT4.7+VassistX 具体如何配置看这个帖子:http://qimo601.iteye.com/blo ...

  8. qt学习笔记(七)之数据库简介(所有支持数据库类型的列表)

    笔者最近用Qt写公司的考勤机.本来要求是要基于frameBuffer下用自己开发的easyGUI来进行上层应用开发,但是考虑到easyGUI提供的接口不是很多,就考虑用Qt来开发,顺带练练手. 废话不 ...

  9. QT 学习笔记概述

    以下笔记为在看书和实践的过程中的部分记录总结: 0. 窗口布局 1) 支持绝对布局和布局管理器布局; 2) 绝对布局不够灵活.无法自动调整大小,需要手动编写代码调整: 3) 布局管理器管理布局比较灵活 ...

  10. QT学习笔记(一)——ui的认识

    ////////////2015/08/06/////////////////// ///////////by xbw////////////////////////// //////////环境 Q ...

随机推荐

  1. 16-集电极开路门(OC门)

    集电极开路门(OC门) OC门 两个与非门,要实现非,一般来讲再与一下就可以. 能不能将输出端并在一起?普通的门电路永远不可能输出端并在一起,连在一起的. TTL与非门输出端连在一起 集电极断开之后连 ...

  2. Qt5.9 UI设计(二)——最简Qt工程搭建

    前言 前面一章已经介绍了QT的开发环境的安装,这里介绍一下一个最简工程的搭建 操作步骤 新建项目 选择带界面的Qt Widgets Application 设置项目位置 注意这里的目录不能有中文路径 ...

  3. Mygin实现动态路由

    本篇是Mygin的第四篇 目的 使用 Trie 树实现动态路由解析. 参数绑定 前缀树 本篇比前几篇要复杂一点,原来的路由是用map实现,索引非常高效,但是有一个弊端,键值对的存储的方式,只能用来索引 ...

  4. 幻兽帕鲁 Palworld 私有服务器一键部署教程

    <幻兽帕鲁>(日语:パルワールド,英语:Palworld) 是由日本开发商 Pocket Pair 推出的一款动作冒险生存游戏.游戏设定在一个由类似动物的生物 "帕鲁" ...

  5. [转帖]《Linux性能优化实战》笔记(十七)—— Linux网络基础与性能指标

    一. 网络模型 1. OSI 网络模型(七层) 为了解决网络互联中异构设备的兼容性问题,并解耦复杂的网络包处理流程,OSI 模型把网络互联的框架分为七层,每个层负责不同的功能.其中, 应用层,负责为应 ...

  6. [转帖]CPU Turbo&Cstate&Pstate简介

    https://www.jianshu.com/p/eaefd1eb0ac6 测试环境 CPU 1 Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz 16 3130 3 ...

  7. ContextSwitch 学习与使用

    ContextSwitch 学习与使用 说明 github上面有一个简单的测试系统调用以及上下文切换的工具. contextswitch. 下载之后直接make就可以进行简单的测试 需要注意的是 部分 ...

  8. 基于CefSharp开发浏览器(十)浏览器CefSharp.Wpf中文输入法偏移处理

    一.前言 两年多来未曾更新博客,最近一位朋友向我咨询中文输入法问题.具体而言,他在使用CefSharp WPF版本时遇到了一个问题,即输入法突然出现在屏幕的左上角.在这里记录下处理这个问题的过程,希望 ...

  9. SUBMIT指定用户名错误

    1.SUBMIT说明 在ABAP中,SUBMIT关键字用于运行另一个ABAP程序.通过SUBMIT关键字,可以在当前程序内部调用其他程序,而无需关闭当前程序. SUBMIT语句的一般语法如下: &qu ...

  10. Mac 版的 Quicker CirMenu

    之前在Windows上用过一款圆盘菜单工具Quicker, 感觉非常方便, 换成Macos后,一直没有找到类似应用. 最近终于发现,一款好用的快捷键收集,触发工具CirMenu. 其核心功能是可以根据 ...