《C++ Qt设计模式》 第一章 C++ 简介
第1 章 C++简介
内容:
编译相关
Qt提供了一个qmake工具,它会产生Makefile 文件。使用qmake -project 命令产生一个简单的工程文件。当执行这个命令时,qmake 会将当前工作目录下的全部源文件作为SOURCES列出来,而将全部头文件作为HEADERS 列出来
使用make 重新编译那些发生了变化的文件,或者那些由于任何变化而受到影响的文件,而不会盲目编译每一个源文件。
如果要在工程中添加更多的源代码文件、头文件或者库模块,则必须编辑.pro 文件,将新项目添加到相应的sources,headers 或者 libs 列表中。
1.8 字符串
1.const char * C语言风格的字符串,主要用于与C 语言库的接口。
2.来自于C++ 标准库的string ,任何地方都可以使用这种类型。
3.Qstring ,有丰富的API 而且更容易使用。它的实现支持延时写时复制(lazy copy-on-write)和隐式共享(implicit sharing),不必每一次都为字符串分配内存并进行复制。此外,Qstring 还内置支持Unicode 标准,以方便程序的国际化。
1.9 流
标准库中定义了 iostream ,Qt中定义了 QTextStream 。
iostream 中定义了三种全局流:cin cout cerr ,iostream 中还定义了操作算子,比如flush 和 endl 。操作算子被函数隐式调用,这些函数能够以各种方式改变流的状态。
实例:
用于:进制转换,输出形式,bool形式,小数点位数,是否带上加号。
与iostream 相对应的是QTextStream,还有一个全局函数QDebug(),用它可以方便地将消息发送到控制台(不管控制台是什么),具有灵活的接口。
实例:
1.10 文件流
流被用来读取、写入文件,连接网络和处理字符串
Qt中使用 QString 和 QFile ,前者具备功能强大而灵活的字符串表示能力,后者提供处理文件的接口。
#include <QString> #include <QTextStream> #include <QDebug> #include <QFile> QTextStream cout(stdout); int main() { QString ss("tangyuanjie"); cout<<ss<<endl; qDebug()<<"here is a debug message!!"<<endl; //文件操作 //写入文件 QFile data("mydata");//创建文件 data.open(QIODevice::WriteOnly);//打开文件 QTextStream out(&data); //创建流,指向文件 out<<ss<<endl; out<<"another line of string."; data.close();//关闭文件 //读取文件 cout<<"read data from the file."<<endl; if(data.open(QIODevice::ReadOnly))//读取之前确保文件存在 { QTextStream in(&data); QString newstr; while(! in.atEnd()) { newstr = in.readLine();//一行一行的读取 cout<<newstr<<endl; } data.close();//关闭文件 } return 0; }
C++ 对象的大小
#include <QString> #include <QTextStream> #include <QDebug> #include <QFile> #include <QDate> #include <QChar> QTextStream cout(stdout); int main() { cout<<"sizeof(char):"<<sizeof(char)<<endl; cout<<"sizeof(int):"<<sizeof(int)<<endl; cout<<"sizeof(short):"<<sizeof(short)<<endl; cout<<"sizeof(double):"<<sizeof(double)<<endl; cout<<"sizeof(int*):"<<sizeof(int*)<<endl; cout<<"sizeof(long):"<<sizeof(long)<<endl; cout<<"sizeof(Qstring):"<<sizeof(QString)<<endl; cout<<"sizeof(qint32):"<<sizeof(qint32)<<endl; cout<<"sizeof(qint64):"<<sizeof(qint64)<<endl; cout<<"sizeof(QDate):"<<sizeof(QDate)<<endl; cout<<"sizeof(qchar):"<<sizeof(QChar)<<endl; return 0; }
结果:
QString(或者实例str) 只有4个字节,但是它是一个动态内存的复杂类,需要调用length()来获得字符串中char 的数量。
1.13.1 main 与命令行参数
int main(int argc, char* argv[])
int main(int argcount, char** argValues)
int main(int argc, char* const argv[])
这些形式都是有效的,它们都定义了两个参数:int 型参数包含了命令行参数的个数,而C 风格的字符串数组包含了实际的参数。这些参数从父进程传递给程序,包含了用于重构命令行参数所需的足够信息。
1.14 const 关键字
一般而言,将常量孤立出来,可以提高程序的可维护性。
例如:
const int SIZE = 322; ... for(i = 0; i < SIZE; i++) { ... }
在某些C或者C++程序中,可能会看到将常量定义成预处理器宏的情况,例如
#define STRSIZE 80
...
char str[STRSIZE];
在编译器看到预处理器宏之前,它将被替换。而const表达式可以进行类型检查。
1.15 指针与内存访问
& 称为取地址运算符
int* 称为指针
指针占用内存大小为sizeof(int) 大小,
*x,* 被称为解引用运算符;
1.15.2
new 运算符从堆(heap,也称为动态内存)中分配内存空间,并且返回新分配对象的指针。
delete 运算符的作用是释放动态分配的内存并将其返回给堆。delete 操作只能用于由new 运算符返回的指针或者空指针。
1.16 引用变量
在C++中,引用(reference)提供了一种给左值赋予一个别名的机制,避免不必要的复制,例如向函数传送一个非常大的对象作为参数。引用必须在声明时进行初始化。
int n;
int& rn = n;
1.17 const* 和 *const
const char* x = &p 不可改变对象的值;
char* const y =&p 指针不能指向其他对象;