面向对象编程: 封装、继承、多态。
1、封装:C++的封装相对于C语言的结构体里面除了变量外还有函数。
2、继承:利用以前写过的内容。
3、多态:多种形态,调用同一个函数得到不同的结果。
#include<stdio.h>
struct Test
{
int a;
void setA(int x) //C++中类中可以有函数
{
a=x;
}
int getA()
{
return a;
}
};
int main()
{
//Test结构体类型, 在C++中叫做类
//obj结构体变量,在C++中叫做对象
Test obj; //C++中声明可以不加struct关键字
obj.a = 101;
obj.setA(1001); //调用完毕setA函数后变量a不会释放,只有obj的生命周期结束后,变量a才释放。
int tmp=obj.getA();
printf("tmp=%d\n",tmp);
return 0;
}
使用gcc编译C++代码时候需要增加一个 -lstdc++指令 如 gcc 1.cpp -lstdc++
struct Test
{
int a;
void setA(); //类中声明,类外定义函数
static void fun()//静态函数可以通过类型名调用,无需创建对象。静态函数也可以通过对象来调用
{
printf("fun\n");
}
};
类型定义函数需要增加作用域,告诉编译器setA属于struct Tset。
void Test::setA()
{
a=101;
}
int main()
{
Test::fun();//静态函数可以通过类型名调用,无需创建对象。 静态函数也可以通过对象来调用
Test obj;
obj.setA();//非静态函数必须通过对象调用。
}
1、C++的结构体中可以有变量也可以有函数,变量在结构体内部相当于内部的全局变量。
2、先创建结构体变量(对象),通过此变量(对象)可以调用成员。
3、如果结构体中函数为static函数,那么此函数可以直接被类/结构体调用。
4、可以在类中(结构体)中声明函数,类外定义函数,类型定义时候一定要加作用域。
构造函数、析构函数,这两个函数不需要人为调用,是自动调用的。
构造函数:对象创建时(窗口显示前)自动调用构造函数。(用于分配空间)
析构函数:对象结束前(窗口关闭的一瞬间)自动调用析构函数做一些清理工作。释放空间。
F4快捷键可以实现QT中构造函数的.h文件出现地方和.cpp文件出现地方相互切换。
qt代码中输入一个对象如ui后按一下“.”自动匹配“->”或“.”
qDebug()函数的头文件为<QDEBUG>, qDeug打印功能巨强大。
qDebug<<"hello word";
选中某个QT的函数按一下F1按键就可以看这个函数的相关介绍。或者在QT界面最左侧点击帮助,在搜索框中输入要查询的函数。
构造函数调用某个函数的时候可以将这个函数在构造函数所在的类中声明,并类外定义,类外定义的时候要加上作用域::
如果要封装某个函数,且这个函数要使用类中的ui控件,此函数必须为类中声明,类外定义,定义时格式为 “类名::函数名”
字符编码
1、给QT的控制件设置内容,如果有中文,必须是utf-8编码
2、从QT得到字符串,如果有中文,编码是utf-8
3、如果使用标准C函数,如果有中文,则中文必须是gbk编码。
a)头文件#include <QTextCodec>
b)定义一个全局变量QTextCodec *codec;
c)构造函数内部初始化。 codec = QTextCodec::codecForName("GBK"); /*实际执行中,仍是乱码,当函数参数改为UTF-8后解决乱码问题,即 codec = QTextCodec::codecForName("UTF-8"); */
d) gbk -> utf-8 : 调用codec->toUnicode(); /*把gbk转化为utf-8*/
e) utf-8 -> gbk: 调用codec->fromUnicode(); /*把utf-8转化为gbk*/
ANSI、gbk、gb1830、gb2312等都是windows下的中文编码
utf-8是linux和QT下的中文编码。
槽函数:相当于按钮按下后的操作,
windows下避免控制台一闪而过的指令为cmd /k指令,如system(" cmd /k C:\\Users\\Administrator\\Desktop\\Code\\Hello.o ");
/*QT实现编译器简单功能的mainwindow.cpp函数如下所示:*/
/*mainwindow.cpp*/
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDEBUG>//调用qDeug,打印功能巨强大。
#include <QTextCodec>/*字符编码转换头文件*/
#include <QFileDialog>//文件对话框
#include <string.h>//文件对话框
#define cout qDebug()
QTextCodec *codec; /*字符编码指针*/
QString path; /*全局变量的路径*/
enum MyCode /*枚举变量*/
{
utf_8,
gbk
};
enum MyCode flag;
/*构造函数,主要做初始化工作*/
/*在创建对象时,窗口显示前,自动调用*/
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
flag = utf_8; /*初始化默认为utf-8编码*/
codec = QTextCodec::codecForName("GBK"); /*字符编码指针初始化,指导书让填参数"GBK"但是填上后显示为乱码,
参数改为"UTF-8"后,没有乱码,可能与系统QT4.2.0有关*/
path = ""; /*初始化路径为空*/
}
/*析构函数,对象结束前(窗口关闭前),自动调用析构函数,做一些清理工作*/
MainWindow::~MainWindow()
{
delete ui;
}
/*转到槽函数,相当于按钮按下后的操作*/
/*utf-8按钮*/
void MainWindow::on_actionUtf_8_triggered()
{
flag = utf_8;
ui->label->setText(codec->toUnicode("当前是utf-8格式"));
}
/*gbk按钮*/
void MainWindow::on_actionGbk_triggered()
{
flag = gbk;
ui->label->setText(codec->toUnicode("当前是gbk格式"));
}
/*open按钮处理函数*/
void MainWindow::on_actionOPEN_triggered()
{
//1、获取文件的目录
path = QFileDialog::getOpenFileName();
cout<<"path= "<<path;
if(path.isEmpty())//如果没有选择路径 或者if(path == "")
{
return;
}
//2、由于是通过QT的控件获取获取路径,所以此路径是utf-8格式需要转换为gbk格式, 同时将路径转为char *类型
// 可能是QT 4.2.0 设置的原因,感觉这一步得到的fileName结果为空
#if 0
char *fileName = codec->fromUnicode(path).data();
cout<<"fileName= "<<fileName;
#endif
//3、打开文件fopen(),fopen()如果参数有中文话,需要是gbk格式
char *path1;
path1 = path.toLatin1().data(); //将Qstring类型转化为char*类型
cout<<"path1="<<path1; /*若是中文路径,还是出错,待研究*/
FILE * fp = fopen(path1,"rb");
if(NULL == fp)
{
cout<<"on_actionOPEN_triggered() fopen error";
return;
}
//4、循环读取内容,fgets(),读取内容是char *
char buf[2048];
QString str="";
while(1)
{
memset(buf,0, sizeof(buf));//读之前清空buf内容。
fgets(buf,sizeof(buf),fp);
if(utf_8==flag)
{
//str = str+buf;
str = str+codec->toUnicode(buf);
}
else if(gbk == flag)
{
str = str+codec->toUnicode(buf); /*若buf是gbk字符串,则转换为utf-8的格式*/
}
if( feof(fp) )
{
break;
}
}
//5、需要把读取的内容给编辑区设置setText()
ui->textEdit->setText(str);
//6、关闭文件
fclose(fp);
}
/*另存为按钮*/
void MainWindow::on_actionSAVES_triggered()
{
//1、选择一个文件保存的路径,这个路径是从QT得到所以是utf-8格式,返回类型是QString
path = QFileDialog::getSaveFileName();
cout<<"path= "<<path;
if(path.isEmpty())//如果没有选择路径 或者if(path == "")
{
return;
}
//2、需要将路径的utf-8转换为gbk格式,同时将QString类型转化为char *类型
#if 0
char *fileName = codec->fromUnicode(path).data();
cout<<"fileName= "<<fileName;
#endif
//3、打开文件fopen(),fopen()如果参数有中文话,需要是gbk格式
char *path1;
path1 = path.toLatin1().data(); //将Qstring类型转化为char*类型
cout<<"path1="<<path1; /*若是中文路径,还是出错,待研究*/
//FILE * fp = fopen(fileName,"wb");
FILE * fp = fopen(path1,"wb");
if(NULL == fp)
{
cout<<":on_actionSAVES_triggered() fopen error";
return;
}
//4、获取编辑区的内容QString
QString str = ui->textEdit->toPlainText();
//5、将编辑区的内容QString转换为char *类型
const char *buf = str.toStdString().data();
//6、将编辑区的内容写为文件,fputs函数
fputs(buf,fp);
//7、关闭文件
fclose(fp);
}
//撤销undo的转到槽函数
void MainWindow::on_actionUNDO_triggered()
{
ui->textEdit->undo();
}
//拷贝copy的转到槽函数
void MainWindow::on_actionCopy_triggered()
{
ui->textEdit->copy();
}
//粘贴paste的转到槽函数
void MainWindow::on_actionPaste_triggered()
{
ui->textEdit->paste();
}
//剪切cut的转到槽函数
void MainWindow::on_actionCut_triggered()
{
ui->textEdit->cut();
}
//编译compile的转到槽函数
void MainWindow::on_actionCompile_triggered()
{
//system(" gcc C:\\Users\\Administrator\\Desktop\\Code\\Hello.c -o C:\\Users\\Administrator\\Desktop\\Code\\Hello");
//system(" cmd /k C:\\Users\\Administrator\\Desktop\\Hello");
if(path.isEmpty())
{
return;
}
cout<<"path = "<<path;
QString demo = path ;
demo.replace(".c",""); /*将path中的".c"替换成空“”*/
QString cmd = QString("gcc %1 -o %2").arg(path).arg(demo); /*组装一个cmd命令字符串*/
/*如果命令中路径有中文,则要转为gbk格式,QString类型也要转为char *类型*/
int ret = system(codec->fromUnicode(cmd).data());
cout<<"ret = "<<ret;
if(ret!=0)
{
/*编译出错的时候增加 cmd /k指令再编译一次,目的是为了打印编译错误*/
cmd = QString("cmd /k gcc %1 -o %2").arg(path).arg(demo); /*组装一个cmd命令字符串*/
system(codec->fromUnicode(cmd).data());
}
else
{
/*编译成功的时候需要执行以下编译后的可执行文件*/
QString target = QString("cmd /k %1 ").arg(demo);
/*如果命令中路径有中文,则要转为gbk格式,QString类型也要转为char *类型*/
system(codec->fromUnicode(target).data());
}
}
/*退出exit的槽函数*/
void MainWindow::on_actionExit_triggered()
{
exit(0);
}
/*新建new的槽函数*/
void MainWindow::on_actionNEW_triggered()
{
ui->textEdit->clear(); /*清空Text区域*/
//ui->textEdit->setText("");/*内容设为空也是相当于清空Text区域*/
path.clear();/*清空路径代表没有选择路径*/
// path="";
}
/*保存save的槽函数*/
void MainWindow::on_actionSAVE_triggered()
{
/*如果路径为空,说明没有选择路径,我们就需要选择路径*//*如果路径不为空,说明已经选择了路径,我们只需将内容保存到之前的路径*/
if(path.isEmpty())
{
path = QFileDialog::getSaveFileName();
if(path.isEmpty())
{
return;
}
}
//接下来操作和另存为saveas的操作一样
//1、打开文件;2、获取编辑区内容;3、保存文件; 4、关闭文件。
//2、需要将路径的utf-8转换为gbk格式,同时将QString类型转化为char *类型
#if 0
char *fileName = codec->fromUnicode(path).data();
cout<<"fileName= "<<fileName;
#endif
//3、打开文件fopen(),fopen()如果参数有中文话,需要是gbk格式
char *path1;
path1 = path.toLatin1().data(); //将Qstring类型转化为char*类型
cout<<"path1="<<path1; /*若是中文路径,还是出错,待研究*/
//FILE * fp = fopen(fileName,"wb");
FILE * fp = fopen(path1,"wb");
if(NULL == fp)
{
cout<<":on_actionSAVES_triggered() fopen error";
return;
}
//4、获取编辑区的内容QString
QString str = ui->textEdit->toPlainText();
//5、将编辑区的内容QString转换为char *类型
const char *buf = str.toStdString().data();
//6、将编辑区的内容写为文件,fputs函数
fputs(buf,fp);
//7、关闭文件
fclose(fp);
}