Qt学习(开发环境Visual Studio)1.C++知识
介绍在Qt学习中使用到的C++知识,后续会不断拓展和补充~
关于c++比较全的知识可以看:https://www.runoob.com/cplusplus/cpp-tutorial.html
C++基本变量类型
1.整型
数据类型 占用空间(字节)
short (短整型) 2
int (整型) 4
long (长整型) 4
long long(长长整型) 8
2.浮点型
(实型):表示小数类型的数据
|
数据类型 |
占用空间 | 有效数字范围 |
| float | 4字节 | 6~ 7位 |
| double | 8字节 | 15~16位 |
浮点数为什么没有无符号数据类型 ?
| 原因 | 说明 |
|---|---|
| 浮点数的用途 | 需要表示正负值,无符号限制太大 |
| IEEE 754 标准 | 符号位固定,修改会影响兼容性 |
| 硬件优化 | CPU/GPU 浮点运算针对有符号优化 |
| 实际需求低 | 几乎没有“绝对非负”的浮点需求 |
| 潜在问题 | 零和无穷表示、范围/精度权衡 |
3.字符型
字符型变量只占用1个字节, 字符型变量是将对应的ASCII编码存放至内存,而不是字符本身. char ch = 'a'; 单引号有且仅有一个字符,不可以字符串。
为什么没有3字节的数据类型?
因为2的指数才好设计总线系统,2的指数才好设计存储和内存的架构。
-
现代CPU通常以2的幂次方(如1、2、4、8字节)为单位访问内存。例如,32位CPU一次可读取4字节,64位CPU可读取8字节。如果使用3字节变量,可能导致“不对齐访问”(例如,一个3字节变量跨两个4字节内存块),这会显著降低性能(需要多次内存操作,甚至触发硬件异常)。
-
对齐填充(Padding):编译器会自动为结构体填充字节以保证对齐
4.转义字符
字符型变量只占用1个字节, 字符型变量是将对应的ASCII编码存放至内存,而不是字符本身
char ch = 'a'; 单引号有且仅有一个字符,不可以字符串
为什么没有3字节的数据类型?
因为2的指数才好设计总线系统,2的指数才好设计存储和内存的架构。
-
现代CPU通常以2的幂次方(如1、2、4、8字节)为单位访问内存。例如,32位CPU一次可读取4字节,64位CPU可读取8字节。如果使用3字节变量,可能导致“不对齐访问”(例如,一个3字节变量跨两个4字节内存块),这会显著降低性能(需要多次内存操作,甚至触发硬件异常)。
-
对齐填充(Padding):编译器会自动为结构体填充字节以保证对齐
5.字符串型
作用:表示一串字符
(1)C风格字符串: char 变量名[] = "字符串值";
(2)C++风格字符串: string 变量名 = "字符串值";
6.布尔类型 bool
C++的bool类型中,true 或 任意非0值均代表“真”; false或 0值 代表“假”。
变量的作用域和生存期
c++中有三个地方可以定义变量
- 函数或一个代码块内部声明的变量,称为局部变量
- 函数参数的定义中声明的变量,称为形式参数
- 在所有函数外部声明的变量,称为全局变量(不建议使用)
作用域分为以下几种
- 局部作用域 :在函数内部声明的变量,只能在函数内部访问。局部变量在函数每次被调用的时候被创建,在函数执行完成后被销毁。
- 全局作用域:全局变量具有全局作用域,可以被程序的任何函数访问。全局变量在程序开始时被创建,在程序结束时被销毁。
- 块作用域:在代码块内部声明的变量具有块作用域,它们只能在代码块内部访问。块作用域变量在代码块每次被执行时被创建,在代码块执行完后被销毁。
- 类作用域:在类内部声明的变量具有类作用域,它们可以被类的所有成员函数访问,类类作用域变量的生命周期与类的生命周期相同。
函数
函数的定义:
函数的定义一般主要有5个步骤:
1、返回值类型
2、函数名
3、参数表列
4、函数体语句
5、return 表达式
-
返回值类型 :一个函数可以返回一个值。在函数定义中
-
函数名:给函数起个名称
-
参数列表:使用该函数时,传入的数据
-
函数体语句:花括号内的代码,函数内需要执行的语句
-
return表达式: 和返回值类型挂钩,函数执行完后,返回相应的数据
函数的分类
根据有无参数和有无返回值可以将函数分成四类:
//函数常见样式
//1、 无参无返
void test01()
{
//void a = 10; //无类型不可以创建变量,原因无法分配内存
cout << "this is test01" << endl;
//test01(); 函数调用
}
//2、 有参无返
void test02(int a)
{
cout << "this is test02" << endl;
cout << "a = " << a << endl;
}
//3、无参有返
int test03()
{
cout << "this is test03 " << endl;
return 10;
}
//4、有参有返
int test04(int a, int b)
{
cout << "this is test04 " << endl;
int sum = a + b;
return sum;
}
函数的声明
作用: 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
函数的声明可以有很多次,但是函数的定义只能有一次
函数的分文件编写
这样是为了使代码结构更清晰,分为四个步骤:
- 创建名为.h的头文件
- 创建后缀为.cpp的源文件
- 在头文件写函数的声明
- 在源文件写函数的定义
指针和引用
指针是一个变量,存储的是一个地址,指向内存的一个存储单元(类似于门牌号);
引用是原变量的一个别名,跟原来的变量实质上是同一个东西(理解为它的小号)。
引用和指针的区别可以看:https://www.runoob.com/cplusplus/cpp-references.html
int a = 996;
int *p = &a; // p是指针, &在此是求地址运算
int &r = a; // r是引用, &在此起标识作用
p的值是变量a的地址;
引用r是a的一个别名,在内存中r和a占有同一个存储空间。
一个指针在32位的计算机上,占4个字节;
一个指针在64位的计算机上,占8个字节。
const修饰指针有三种情况
-
const修饰指针 --- 常量指针
-
const修饰常量 --- 指针常量
-
const即修饰指针,又修饰常量
结构体
结构体属于用户自定义的数据类型,用于储存不同的数据类型
常用的语法:
struct PersonParam
{
QString pp_name = "张三"; //姓名
QString pp_sex = "男"; //性别
int pp_age = 19; //年龄
QString pp_resume = "简历"; //简历
};
注意需要添加注释,由于代码里面涉及到很多变量,为了更好地区分,我们把PersonParam(也可以叫PersonInfo)里面的参数加一个前缀pp。结构体变量利用“.”可以访问成员。
类
在 C++ 中,class和 struct 有很多相似之处,它们都可以用来定义自定义的数据类型,封装数据和函数。类中的数据称为成员变量,函数称为成员函数。类可以看作是一种模板,可以用来创建具有相同属性和行为的多个对象。
class PersonInfoWid : public QWidget
{
Q_OBJECT
public:
PersonInfoWid(QWidget *parent = nullptr);
~PersonInfoWid();
private slots:
/*
* @brief 添加一行
*/
void slotAppend ();
/*
* @brief 插入一行
*/
void slotInsert();
/*
* @brief 删除一行
*/
void slotDelete();
/*
* @brief 显示人员信息
*/
void slotShow();
private:
/*
* @brief 设置当前行内容
* @param int 行数 const 人员信息
*/
void set_row_data(int row, const PersonParam& pp);
/*
* @brief 获取人员信息
* @return 人员信息
*/
PersonParam get_row_data();
private:
Ui::PersonInfoWidClass ui;
};
关键字 public 确定了类成员的访问属性。在类对象作用域内,公共成员在类的外部是可访问的。也可以指定类的成员为 private 或 protected。
| 访问 | public | protected | private |
| 同一个类 | yes | yes | yes |
| 派生类 | yes | yes | no |
| 外部的类 | yes | no | no |
更多推荐



所有评论(0)