【QT-C++-2022-11-23】

本文探讨了C++中explicit和implicit关键字在构造函数声明中的应用,解释了两者区别,并介绍了QT中QDomElement处理XML的常见函数,包括读写XML文件的方法和QFileInfo类的相关功能。还讲解了volatile关键字在内存优化中的作用。
摘要由CSDN通过智能技术生成

explicit与implicit之间的关联与区别

C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)

显示声明与隐式声明的区别是什么?

  1. 没有使用explicit关键字的类声明,即默认为隐式声明
  2. explicit取消了隐式转换,举例
  3. explicit关键字的作用就是防止类构造函数的隐式自动转换
  4. 只对一个参数的构造函数有效,如果构造函数参数大于等于两个是,是不会产生隐式转换的,因此该关键字也就无效了。
  5. 当除了第一个参数意外的其他参数都有默认值的时候,explicit关键字依然有效。此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数。
class cString
{
	public:
	int size;
	cString(int size)
	{
		this.size = size;
	}
}

如下调用:

cString str1(12);	//可以调用
cString str2 = 10;	//也是可以的,这时候系统会隐式转换,将其转化为cString str2(10);进行调用
//但是此写法容易引起歧义,因此在构造函数前加上explicit修饰,可以避免此写法的产生

QDomElement类

QT中实现对xml读写操作的类是QDomDocument相关的类,一般包括下列三个头文件
QFile
QtXml\QtXml
QtXml\QDomDocument

写xml常用函数

QDomDocument doc;
QDomProcessingInstruction instruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
doc.appendChild(instruction);
 
QDomElement root = doc.createElement("HInfoData");//创建根节点
doc.appendChild(root);//添加根节点
 
QDomElement strMac = doc.createElement("Mac");//创建元素节点
root.appendChild(strMac);//添加元素节点到根节点
QDomText strMacNodeText = doc.createTextNode(data._strMac);//创建元素文本
strMac.appendChild(strMacNodeText);//添加元素文本到元素节点

保存XML文件

QFile file("./test.xml");
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
    return false;
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out, 4, QDomNode::EncodingFromTextStream);
file.close();

读xml文件

QDomDocument doc;
QFile file("./test.xml");
if (!file.open(QIODevice::ReadOnly))
{
    return false;
}
 
if (!doc.setContent(&file)) 
{
    file.close();
    return false;
}
file.close();

QFileInfo类–文件信息类

QFileInfo类提供与系统无关的文件信息,QFileInfo提供了关于文件的名称和在文件系统中的位置(路径)、它的访问权限以及它是目录还是符号链接等信息。文件的大小和最后修改/读取时间也可用。

常用方法

1.如果该对象指向目录或指向目录的符号链接,则返回true;否则返回false。

bool isDir() const

2.如果该对象指向文件或指向文件的符号链接,则返回true。如果对象指向的不是文件,比如目录,则返回false。

bool isFile() const

3.如果这是一个“隐藏”文件,则返回true;否则返回false。

bool isHidden() const

4.如果该对象指向符号链接,则返回true;否则返回false。

bool isSymLink() const

5.返回符号链接指向的文件或目录的绝对路径,如果对象不是符号链接,则返回空字符串。

QString symLinkTarget() const

6.返回文件的后缀(扩展名)。

QString suffix() const

7.返回文件的完整后缀(扩展名)。

QString completeSuffix() const

8.返回文件的名称(不包括路径)。

QString fileName() const

9.返回文件的基本名称,不包含路径。

QString baseName() const

10.返回文件名,包括路径(可以是绝对的或相对的)。

QString filePath() const

11.返回包含文件名的绝对路径。

QString absoluteFilePath() const

12.返回文件的路径。这不包括文件名。

QString path() const

13.以字节为单位返回文件大小。如果文件不存在或无法获取,则返回0。

qint64 size() const

14.返回文件创建/生成的日期和时间。

QDateTime birthTime() const

15.返回文件最后修改的日期和本地时间。

QDateTime lastModified() const

volatile关键字

volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Create Possible

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值