关于一些C++、Qt、Python方面的术语
杂鱼之前纯粹用python没细致理解过的术语整理一下,常看常新(
定义 (Definition):
定义是指给一个实体分配内存空间,以便在程序中使用。在C++和Python中,这个实体可以是变量、函数或类。在C++中,定义通常是在声明之后实现实体的内容。
例如f(int a, int b)
// 定义整数变量x
int x;
// 定义函数add,计算两个整数的和
int add(int a, int b) {
return a + b;
}
# 定义整数变量x
x = 10
# 定义函数add,计算两个整数的和
def add(a, b):
return a + b
声明 (Declaration):
声明是指在程序中声明实体的存在,但不为其分配内存空间。在C++和Python中,这允许在使用实体之前提前告诉编译器或解释器实体的名称和类型。
例如f(int, int)
// 声明整数变量y
extern int y;
// 声明函数add,用于计算两个整数的和
int add(int a, int b);
Python不需要显式声明
实例 (Instance):
实例是类的一个具体对象。在C++和Python中,实例化是创建一个类的实例,并在内存中分配空间以存储其属性和方法。
// 定义一个简单的类Person
class Person {
public:
int age;
};
// 创建Person类的实例p1
Person p1;
p1.age = 30; // 设置实例p1的age属性为30
# 定义一个简单的类Person
class Person:
pass
# 创建Person类的实例p1
p1 = Person()
p1.age = 30 # 设置实例p1的age属性为30
调用 (Call):
调用是指执行函数或方法的过程。在C++和Python中,通过使用函数或方法的名称和适当的参数来调用它。
例如f(a, b)
// 定义函数multiply,计算两个整数的乘积
int multiply(int a, int b) {
return a * b;
}
// 调用函数multiply,并将结果存储在变量result中
int result = multiply(5, 3);
# 定义函数multiply,计算两个整数的乘积
def multiply(a, b):
return a * b
# 调用函数multiply,并将结果存储在变量result中
result = multiply(5, 3)
继承 (Inheritance):
继承是面向对象编程中的重要概念,允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。
// 定义一个基类Animal
class Animal {
public:
void makeSound() {
cout << "Some generic sound" << endl;
}
};
// 定义一个派生类Dog,继承自Animal
class Dog : public Animal {
public:
void makeSound() {
cout << "Woof! Woof!" << endl;
}
};
// 创建Dog类的实例d1,并调用其makeSound方法
Dog d1;
d1.makeSound(); // 输出:Woof! Woof!
# 定义一个基类Animal
class Animal:
def makeSound(self):
print("Some generic sound")
# 定义一个派生类Dog,继承自Animal
class Dog(Animal):
def makeSound(self):
print("Woof! Woof!")
# 创建Dog类的实例d1,并调用其makeSound方法
d1 = Dog()
d1.makeSound() # 输出:Woof! Woof!
Animal是Dog的父类项
封装 (Encapsulation):
封装是一种面向对象编程的概念,指将数据和代码封装在一个单元内,并对外部隐藏实现细节。这样可以确保数据的安全性并简化代码的使用。
class Person {
private:
int age;
public:
void setAge(int newAge) {
age = newAge;
}
int getAge() {
return age;
}
};
// 创建Person类的实例p1
Person p1;
p1.setAge(25);
int currentAge = p1.getAge(); // 通过公共方法访问私有属性age
在Python中,没有严格的访问控制,但通过约定将属性定义为私有的并提供公共方法来实现封装。
打包 (Packaging):
打包是指将相关的模块和资源组织在一起,以便于发布、安装和使用。在C++中,打包通常指将相关的类、头文件和源文件组织在一起形成库文件。在Python中,打包通常指将模块组织在包中,以便于发布和安装。
在C++中的打包示例:使用C++的SDK (Software Development Kit) 创建一个库文件。
在Python中的打包示例:将相关模块组织在一个文件夹中,并在文件夹中包含一个__init__.py文件,使其成为一个包。
构造函数 (Constructor):
构造函数是在创建类的实例时自动调用的特殊方法,用于初始化对象的属性和状态。在C++中,构造函数的名称与类名相同,在Python中使用__init__方法作为构造函数。
class Person {
public:
int age;
// 构造函数
Person() {
age = 0;
}
Person(int initialAge) {
age = initialAge;
}
};
// 创建Person类的实例p1,并调用带参数的构造函数
Person p1(30);
class Person:
def __init__(self):
self.age = 0
def __init__(self, initialAge):
self.age = initialAge
# 创建Person类的实例p1,并调用带参数的构造函数
p1 = Person(30)
:: (Scope Resolution Operator):
在C++中,::是范围解析运算符,用于指定在特定范围内查找标识符(如类的成员变量或方法)。它也用于访问命名空间中的元素。
在Python中没有::运算符,因为Python使用点(.)作为范围解析运算符。
发射 (Signal) 与 emit:
在Qt中,发射(Signal)是一种用于在对象之间发送消息的机制。信号是特殊的成员函数,当特定事件发生时,可以通过emit关键字发射该信号。其他对象可以连接到这些信号并在信号发射时执行相关的槽函数。
class MyButton : public QPushButton {
Q_OBJECT
signals:
void clickedWithCount(int count);
public slots:
void onButtonClick() {
static int clickCount = 0;
clickCount++;
emit clickedWithCount(clickCount);
}
};
// 创建MyButton的实例,并连接到槽函数
MyButton button;
QObject::connect(&button, &MyButton::clickedWithCount, [](int count) {
cout << "Button clicked " << count << " times" << endl;
});
button.click(); // 触发信号,槽函数输出 "Button clicked 1 times"
button.click(); // 触发信号,槽函数输出 "Button clicked 2 times"
在Python中,没有显式的信号和槽机制,但可以使用Qt for Python中的信号和槽模块来实现类似的功能。
信息与槽函数是Qt中的一种机制,用于在对象之间进行通信。一个对象发出一个信号(信息),而其他对象连接到该信号的槽函数上,当信号被发出时,槽函数将被执行。
在上面的Qt示例中,clickedWithCount是一个信号,而onButtonClick是一个槽函数。
SDK (Software Development Kit):
SDK是软件开发工具包的缩写,是一个用于开发应用程序的集合,通常包括库、API文档、示例代码和工具。SDK可以帮助开发者更容易地使用特定平台或框架的功能。
在C++和Qt中,Qt SDK是一套用于开发跨平台应用程序的工具包,包括Qt库、Qt Creator IDE、Qt文档等。
在Python中,Python SDK(也称为Python标准库)是Python语言的核心库,提供了许多内置模块和函数,用于执行各种任务。
动态 (Dynamic) 与 静态 (Static):
动态和静态通常用于描述语言或类型系统的性质。
动态语言(如Python):变量类型在运行时确定,不需要显式声明类型,具有更大的灵活性,但在某些情况下可能导致运行时错误。
静态语言(如C++):变量类型在编译时确定,需要显式声明类型,更加严格和类型安全,但可能会导致编写代码更繁琐。
在C++中,变量可以具有静态或动态存储持续时间,这与变量的生命周期和作用域有关。在Python中,变量是动态类型的,类型在运行时由解释器推断。
修饰词
修饰词用于控制类中成员的访问权限和特性。它们帮助实现封装、继承和多态等面向对象编程的概念。
public:
在C++和Qt中,public修饰符用于指定类成员的公共访问权限。公共成员可以在类的内部和外部访问,包括类的对象和其他类。
在C++中的示例:
class MyClass {
public:
int publicVar;
void publicMethod() {
// code here
}
};
在Qt中的示例:
class MyClass : public QObject {
Q_OBJECT
public:
int publicVar;
void publicMethod() {
// code here
}
signals:
void mySignal();
};
在Python中,类的成员默认是公共的,没有显式的public关键字。
protected:
在C++和Qt中,protected修饰符用于指定类成员的保护访问权限。保护成员可以在类的内部和派生类中访问,但不能在类的外部访问。
在C++中的示例:
class MyClass {
protected:
int protectedVar;
void protectedMethod() {
// code here
}
};
在Qt中,由于信号和槽机制的特殊需求,Qt中的信号必须定义在protected或public部分。
在Python中,没有显式的protected关键字,但可以通过在属性或方法名称前添加一个下划线来暗示保护属性或方法。
private:
在C++和Qt中,private修饰符用于指定类成员的私有访问权限。私有成员只能在类的内部访问,无法在类的外部和派生类中直接访问。
在C++中的示例:
class MyClass {
private:
int privateVar;
void privateMethod() {
// code here
}
};
在Qt中的示例:
class MyClass : public QObject {
Q_OBJECT
private:
int privateVar;
void privateMethod() {
// code here
}
};
在Python中,通过在属性或方法名称前添加两个下划线来实现类似的效果,即将属性或方法变为私有。
signal 与 slot:
在Qt中,signal是用于发射消息的特殊成员函数,用于实现信息与槽机制。它只声明,不定义,因为它是由Qt的元对象系统处理的。signal用于发出通知,而slot是用于接收通知的槽函数。
在C++和Qt中的示例:
class MyClass : public QObject {
Q_OBJECT
signals:
void mySignal();
public slots:
void mySlot() {
// code here
}
};
在Python中,没有直接的信号和槽机制。但是,通过使用PyQt或PySide这样的Qt for Python库,可以使用相似的信号和槽机制。
——————————————————
有定义声明调用的例子:
#include <iostream>
// 函数声明,只需写参数类型
int add(int, int);
// 函数定义,实现两个整数相加的功能
int add(int a, int b) {
return a + b;
}
int main() {
a = 5;
b = 3;
// 函数调用,传递参数值并获得返回结果
int result = add(a, b);
// 输出结果
std::cout << "Result: " << result << std::endl;
return 0;
}
指针、地址
指针是一个重要的概念,涉及到内存地址和数据类型。让我们逐步解释以下术语:
指针 (Pointer):
指针是一个变量,其值为内存地址,即某个数据在计算机内存中的位置。指针可以指向任何数据类型的变量,包括基本数据类型、数组、结构体、类等。
取地址 (&):
在C++中,使用&运算符可以获取变量的内存地址,即变量的指针。例如,对于变量a,&a表示a的内存地址。
int a = 10;
int* ptr = &a; // 获取变量a的地址,并将其赋值给指针ptr
*a:
在C++中,*号用于两个不同的情况:
a. 定义指针变量:例如,int* ptr; 定义了一个指向整数的指针变量ptr。
b. 解引用操作:例如,*ptr 表示获取指针ptr指向地址的值。这个过程称为解引用,它允许我们访问指针指向地址的数据。
int a = 10;
int* ptr = &a; // 定义指向整数的指针ptr,并将其指向a的地址
int value = *ptr; // 解引用ptr,获取a的值,value现在为10
&a:
&a表示变量a的地址,它是一个指向a的指针。
指针的使用:
指针通常用于动态内存分配、函数参数传递、数组操作等。它们使得我们能够在程序运行时管理内存和操作数据。
int main() {
int a = 10;
int* ptr = &a; // ptr指向变量a的地址
*ptr = 20; // 解引用ptr并将新的值20赋给a
std::cout << "a: " << a << std::endl; // 输出20,因为通过ptr修改了a的值
return 0;
}
上述示例定义了一个指向整数的指针ptr,它指向变量a的地址。通过解引用指针ptr,我们可以修改a的值。修改了指针指向的值也就修改了指针所指向的变量。