结构体
结构体:对基本数据结构进行扩展,将多个对象放置在一起视为一个整体
- 结构体的声明与定义(注意定义后面要跟分号来表示结束)
- 仅有声明的结构体是不完全类型( incomplete type )
- 结构体(以及类)的一处定义原则:翻译单元级别
数据成员与静态数据成员
| 数据成员 | 静态数据成员 |
---|
含义 | 每个对象都有自己的数据成员 | 多个对象之间共享的数据成员(共享内存) | 声明 | 数据成员声明时可以引入 const 、引用等限定 | 同数据成员 | 定义与初始化 | ● 数据成员会在构造类对象时定义 ●( C++11 )类内成员初始化 ● 聚合初始化:从初始化列表到指派初始化器 | ● C++98 :类外定义, const 静态成员的类内初始化 ● C++17 :内联静态成员的初始化 | decltype与auto | ( C++11 )数据成员可以使用 decltype 来声明其类型,但不能使用 auto | 以使用 decltype 来声明其类型, 也可以使用auto | 成员访问 | ● “.” 与“ ->” 操作符 | ● “.” 与“ ->” 操作符 ● “::” 操作符 |
例1:构建点数据类
#include <iostream>
struct Point {
int x;
int y;
int z;
};
struct Point1 {
const int x=20;
decltype(x) y=22;
int z=4;
};
int main()
{
Point p1{ 1,2,3 };
Point p2{ .x=1,.z=3 };
Point* p3;
p3 = &p2;
Point1 p;
Point1* p4 = &p;
std::cout << "x: " << p1.x << " y: " << p1.y << " z: " << p1.z << std::endl;
std::cout << "x: " << p2.x << " y: " << p2.y << " z: " << p2.z << std::endl;
std::cout << "x: " << p3->x << " y: " << p3->y << " z: " << p3->z << std::endl;
std::cout << "x: " << p4->x << " y: " << p4->y << " z: " << p4->z << std::endl;
}
结果:
x: 1 y: 2 z: 3
x: 1 y: 0 z: 3
x: 1 y: 0 z: 3
x: 20 y: 22 z: 4
例2:类外定义静态成员数据
#include <iostream>
struct Point {
static int x;
int y = 0;
};
int Point::x;
int main()
{
Point p1;
Point p2;
p2.x = 10;
p2.y = 20;
std::cout << "x: " << p1.x << " y: " << p1.y << std::endl;
std::cout << "x: " << p2.x << " y: " << p2.y << std::endl;
std::cout << Point::x << std::endl;
}
结果:
x: 10 y: 0
x: 10 y: 20
10
例3: const 静态成员的类内初始化
#include <iostream>
struct Point {
static const int x = 0;
int y = 1;
};
int main()
{
Point p1;
Point *p2;
p2 = &p1;
std::cout << "x: " << p1.x << " y: " << p1.y << std::endl;
std::cout << "x: " << p2->x << " y: " << p2->y << std::endl;
std::cout << "x: " << Point::x << std::endl;
}
结果:
x: 0 y: 1
x: 0 y: 1
x: 0
例4:内联静态成员的初始化
#include <iostream>
struct Point {
inline static int x = 0;
inline static auto y = 1.0;
inline static decltype(y) z = 2;
};
int main()
{
Point p1;
p1.x = 10;
p1.y = 20.156;
p1.z = 30.23;
std::cout << "x: " << p1.x << " y: " << p1.y << " z: " << p1.z << std::endl;
std::cout << "y: " << Point::y << std::endl;
}
结果:
x: 10 y: 20.156 z: 30.23
y: 20.156
参考资料:
《C++ Primer 中文版》(第 5 版) 《C++基础与深度解析》深蓝学院课程
|