c++中使用指针的对象类型标识
Object type identification using pointers in C++
我最近了解到指针包含两种类型的信息:内存地址和它们所指向的类型。我知道如果我有一个指针,那么我就可以判断它指向的对象是整型还是双精度,还是其他基本数据类型。
我的问题是,如果我创建一个名为myObj的对象,我有一个指向myObj的指针,那么我可以从指针中知道它指向的是一个名为myObj的对象吗?还是说指针指向非基本数据类型?
指针包含两种类型的信息是不正确的。一般来说,指针(像任何变量一样)有两个属性:类型和值。
指针的类型指明它所包含的对象的地址。因此,指向int
(即int *
)的指针包含int
的地址。
指针的值是实际对象的地址。这是指针所包含的信息。
使用指针的类型信息和值,可以对指针所指向的对象(或变量)执行任何允许的操作。
例如,
int i;
int *p = &i; // p is of type int *, so points at an int.
// This initialisation gives p a value which is the address of i
*p = 42; // p points at i, *p refers to i, so this statement sets i to be 42
也有一些例外。
一个void
指针(又名void *
)不包含类型信息(void
在此上下文中大约表示"没有类型"),但确实有一个值。
int i;
void *p = (void *)(&i);
*p = 42; // invalid, since p is a void * - it could point at anything
指针可以是未初始化的(例如定义时没有初始值)。在这种情况下,访问它的值会产生未定义的行为。访问指针所指向的对象也是如此(因为要访问指针所指向的对象,必须访问指针本身的值)。
指针可以初始化或赋值为NULL
或(在c++ 11或更高版本中)nullptr
。这是一个特殊值,表示指针不包含对象的地址。访问这样一个不存在的对象也会产生未定义的行为。
class
/struct
类型的情况更加复杂。例如,指向多态类型的指针可以包含该类型的任何对象的地址,以及从该类型派生的任何类型。
指针有一个类型,但它是不是一个类型,该类型必须匹配你返回的obj。
#include<typeinfo>
#include<string>
#include<iostream>
//..
//..
//..
string name = typeid(*myObj).name()
//..
cout<<"Name: "<< name;
//..
返回myObj类型。更多信息:http://en.cppreference.com/w/cpp/language/typeid
给定一个名为MyObj
的类
class MyObj
{
private:
//....
//....
public:
//....
//....
};
指针类型为type MyObj
,如果MyObj下有继承类,它将指向MyObj类型或派生类型。
int main()
{
MyObj obj;
MyObj *ptr = &obj; //adress contained in the pointer
return 0;
}
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- 了解 Python 中的对象类型
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 调用的对象类型 'double' 不是 report() 函数的函数或函数指针
- 基准、值、值类型、对象和对象类型(C++)
- JNI 如何将 Java 对象数组传递给相同对象类型的 C++ 数组
- 在构造过程中更改的对象类型
- 如何构建程序以避免查询对象类型?
- 如何使用Dynamic_cast获得对象类型
- 什么更有效率?在重载函数中或通过在基类函数中检查对象类型来实现
- static_cast实际上不是对象类型的类型是未定义的行为吗?
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 类返回对象类型,但如何返回和检查 null
- 是否可以在辅助功能中概括对象类型
- 表达式必须在C 中具有指针对象类型
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 当将对象传递给具有参数作为引用类型的函数以及当其类对象类型时,会得到不同的输出
- 如何在运行时指定对象类型
- 我可以获取在重载的新运算符中使用新运算符的对象类型吗?