昨天总结
学习了会原子操作的内存次序,基本上是没看懂。改天找个视频再看看。
工作这块没太大进展,上下游问题都很多,难搞哦
leetcode:做了一道丑数的题目,仅仅是前天的延续。
今日计划
工作推进
一道leetcode
看看相关无人机行业的专利
学习记录
c++ 类成员指针:
成员指针是可以指向类的非静态成员的指针。类的静态成员不属于任何对象,因此无须特殊的静态成员的指针,也就是说指向静态成员的指针与普通指针没有什么区别。
成员指针的类型囊括了类的类型以及成员的类型。当初始化一个这样的指针时,我们令其指向类的某个成员,但是不指定该成员所属的对象,直到使用该指针的时候,才提供成员所属的对象。
后续我们用如下的类做示例:
class People {
public:
People() = default;
People(std::string n, int a): name(n), age(a) {}
int get_age() const {return age;}
std::string get_name() const {
return name;
}
void set_age(int age) { this->age = age; }
void set_name(string name) { this->name = name; }
public: // 这里如果定义成private,则不能够赋值
std::string name;
int age;
};
数据成员指针
在声明成员指针时,必须包含成员所属的类,我们必须在*之前加classname::来表示当前定义的指针可以指向classname的成员。
// 定义类数据成员指针,该指针指向People类的一个string类型的数据成员
const string People::*name_ptr;
name_ptr = &People::name; // 成员指针赋值
auto age_ptr = &People::age; // c++新特性
People p("aaa", 15), *ptr_p = &p;
// 使用成员指针的两种
std::cout << p.*name_ptr << " " << ptr_p->*name_ptr << std::endl;
std::cout << p.*age_ptr << " " << ptr_p->*age_ptr << std::endl;
成员函数指针
和指向数据成员指针一样,我们使用classname::*的形式来声明一个指向成员函数的指针。类似于其他函数指针,指向成员函数的指针也需要指定目标函数的返回类型和形参列表。如果成员函数是const或者引用成员,我们必须将其const限定符或这引用限定符号包含进来。
// 定义一个指向People类的返回值为int,形参为空的函数成员的指针
// 出于优先级的关系People::*两段的括号必不可少。
int (People::*get_age_ptr)() const;
get_age_ptr = &People::get_age;
// 定义一个指向People类的返回值为void,形参为int的函数成员指针
void (People::*set_age_ptr)(int) = &People::set_age;
// auto声明函数的指针
auto get_name_ptr = &People::get_name;
// 成员函数指针的使用,指针前后的括号必不可少,原因是掉用运算符的优先级高于成员运算的优先级。
(p.*set_age_ptr)(20);
(ptr_p->*set_age_ptr)(20);
std::cout << (p.*get_age_ptr)() << " " << (ptr_p->*get_age_ptr)()
<< std::endl;
std::cout << (p.*get_name_ptr)() << " " << (ptr_p->*get_name_ptr)()
<< std::endl;