介绍在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;
}

函数的声明

作用: 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。

函数的声明可以有很多次,但是函数的定义只能有一次

函数的分文件编写

这样是为了使代码结构更清晰,分为四个步骤:

  1. 创建名为.h的头文件
  2. 创建后缀为.cpp的源文件
  3. 在头文件写函数的声明
  4. 在源文件写函数的定义

指针和引用

指针是一个变量,存储的是一个地址,指向内存的一个存储单元(类似于门牌号);

引用是原变量的一个别名,跟原来的变量实质上是同一个东西(理解为它的小号)。

引用和指针的区别可以看: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修饰指针有三种情况

  1. const修饰指针 --- 常量指针

  2. const修饰常量 --- 指针常量

  3. 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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐