ceres中遇到的C++(1)
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 abab这样是允许的。但是如果ab都是结构体的对象那么ab是不被允许的但是现在可以通过运算符重载让对象ab也能进行ab。语法函数返回值 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.constconst经常用来表明某个数据不能改变但是其用法存在的许多细节之处还需要补充。比如const double *const abc分成两步来看首先 double *const abcdouble * 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 { templatetypename 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 { templatetypename T void f1(T a) { } // ← 上面那行 template 只管 f1 templatetypename U // ← f2 要再写一次参数名可以不同 void f2(U b) { } // ← 这行只管 f2 void f3() { } // ← 不是模板不需要 template };进阶版二增加了构造函数和作为一个模版结构体。#include hello.h//自己定义的头文件用 #include iostream//标准库的头文件用 using namespace std; templatetypename T struct Student { T age; Student (T a) : age(a) {} void operator()(T b) { cout b endl; } }; int main(int argc,char **argv) { Studentdouble s(1); Studentdouble *p new Studentdouble(2); s(3); (*p)(4); }