《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 指针不能指向其他对象;

  

 

posted @ 2017-04-08 19:59  tmjDD  阅读(1327)  评论(0编辑  收藏  举报