☰
ceres中遇到的C++(1)
2026/9/27 6:19:26 网站建设 项目流程

(1)结构体struct

结构体与类很像,就像是只要public的class。所以C++中的结构体也是可以放函数的,这是与C的最大不同点。如一下代码。

#include "hello.h"//自己定义的头文件用"" #include <iostream>//标准库的头文件用<> using namespace std; struct demo1 { int a; void print_a() { cout << a << endl; } }; int main(int argc,char **argv) { demo1 test; test.a = 10; test.print_a(); }

(2)运算符重载

运算符重载是解决自定义类型数据无法使用一些内置运算符的问题。他的本质是一个函数,他有两种形式,一种是友元重载,另一种是类重载,具体区别是你的具体实现是不是成员函数方式实现,现在说明类重载的方式。

解释重载。比如:int a,b;a+b这样是允许的。但是如果a,b都是结构体的对象,那么a+b是不被允许的,但是现在可以通过运算符重载,让对象a,b,也能进行a+b。语法:函数返回值 operator 运算符(){ },可以把opertor 运算符 整体看成是函数名。例如如下代码。

#include "hello.h"//自己定义的头文件用"" #include <iostream>//标准库的头文件用<> using namespace std; struct demo1 { int a; bool operator()(int c , int b) { int sum = c + b; cout << sum << endl; return true ; } }; int main(int argc,char **argv) { demo1 test; bool d = test(10,20); cout << d << endl; demo1 test2; demo1 *p = &test2; (*p)(20,30); }

注:原先( ) 运算符是函数调用经常被用到,但是结构体的对象是不能用的。现在我们想让结构体的对象可以像调用函数一样使用,那么我们可以重载( ) 运算符。所以我们在结构体的内部写了一个()运算符的重载函数,该函数实现的是输入两个参数,并计算求和打印。随后我们通过定义一个类的对象,然后用对象就是可以像函数一样去使用。当然你一可以使用指针的方式去调用。

3.const

const经常用来表明某个数据不能改变,但是其用法存在的许多细节之处,还需要补充。比如:const double *const abc;分成两步来看,首先 double *const abc,double * abc指的是定义一个指针变量里面可以存放数据类型为double的地址,现在在abc前面加了一个const修饰的是anc本身,表示abc初始化之后就不能改变他的值,比如double *const abc = &b; abc = &c //后面这第二次赋值是不被允许的,因为abc被const所修饰。第二步,const double *const abc,这时候最外边的const表示的是abc所指向的内容不能通过变量abc去修改。比如const double *const abc = &b; *(abc) = 10;这件事情是不被允许,意思是abc去了b的地址,但是被最前面的const修饰之后现在不能通过变量abc去修改这个地址里面的内容,但是其他变量是可以的。比如以下代码是报错的写法。

以下代码是通过其他变量修改其值的写法。

为什么会这样?我的理解是变量b没有被const修饰,所以他并不是一个常值,而后续的abc被const修饰,所以就限定了变量abc的行为,但其数据本身的性质没有改变。

补充:const double *const abc;虽然我们说不能改变abc的值,但可以用它的值临时去做一些计算,从而可以访问其他地址的内容(因为本质上也没改变原先的值)。例如以下代码。

#include "hello.h"//自己定义的头文件用"" #include <iostream>//标准库的头文件用<> using namespace std; int main(int argc,char **argv) { double b[2] = {10,20}; const double *const abc = b; for(int i = 0 ; i < 2;i++) { cout << abc[i] << endl; } }

(4)new动态内存分配

new运算符可以用来申请并分配内存空间,并且返回这片内存空间的首地址。常见语法格式。new type 申请普通变量空间。new type【n】申请数组空间。现在主要是针对ceres使用中new的具体使用案例来理解new的使用。如下代码。

#include "hello.h"//自己定义的头文件用"" #include <iostream>//标准库的头文件用<> using namespace std; struct Student { double age; }; int main(int argc,char **argv) { Student s; s.age = 20; Student *p = new Student; (*p).age = 10; cout << (*p).age << endl; cout << s.age << endl; }

注释:一开始是普通的创建了一个结构体的对象s,并且用让对象s赋值里面的age为10。后续用new Student 在动态内存中创建了一个Student对象,并且返回这个对象的地址这个地址交给了p,然后通过指针的方式去操作这个对象。 补充:一般会delet释放空间,就是当你用完了不在用了,记得delet释放这片空间。

语法结构 : 结构体类型 *指针 = new 结构体类型。

进阶版一:模版放里边。如果模版放外边那么此时修饰的是整个struct,那么strcut里面都可以使用。但是如果放在里面,那么就是要在调用的地方的上一行加上,并且中间不能有其他东西,如果第二个函数想用那么得给第二个函数配套定义一个。

使用的时候也有所区别:1.如果是定义在外边通常在定义对象的时候需要加上<>,如果定义在里面的时候则不需要加上<>。2.定义在里面的当你传入参数的时候他会自动推到类型,比如这里的(*p)(6),我传了一个整数6进去,那么他会根据我传入的这个数据自动推导出相应的类型做匹配所以这时候的T就是int类型。

#include "hello.h"//自己定义的头文件用"" #include <iostream>//标准库的头文件用<> using namespace std; struct Student { template<typename T> void operator()(T b) { cout << b << endl; } }; int main(int argc,char **argv) { Student s; Student *p = new Student; s(5); (*p)(6); }
struct Foo { template<typename T> void f1(T a) { } // ← 上面那行 template 只管 f1 template<typename U> // ← f2 要再写一次(参数名可以不同) void f2(U b) { } // ← 这行只管 f2 void f3() { } // ← 不是模板,不需要 template };

进阶版二:增加了构造函数和作为一个模版结构体。

#include "hello.h"//自己定义的头文件用"" #include <iostream>//标准库的头文件用<> using namespace std; template<typename T> struct Student { T age; Student (T a) : age(a) {} void operator()(T b) { cout << b << endl; } }; int main(int argc,char **argv) { Student<double> s(1); Student<double> *p = new Student<double>(2); s(3); (*p)(4); }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询