[C++_2]结构及函数指针&重载&内联

来源:互联网 发布:mac自动登录 灰色 编辑:程序博客网 时间:2024/05/08 05:14

2 结构指针(意义?)

通过成员指针(相对地址)访问结构成员:

结构变量.*成员指针 结构指针->*成员指针

#include<iostream>#include<string>enum gender{F,M};using namespace std;struct Person{string name;int age;gender g;void printmem(){cout << "Name:" << name<< endl<<" Age:"<<age<<endl<<"Gender:"<<g<<endl;}};void showmem(Person a[], int n ,string Person::*p){for(int i =0; i< n; i++){cout << a[i].*p<< endl;}}int main(){Person p[5]={{"hzt",17,F},{"sdfasd",28,M},{"weifjoi",89,F},{"dsjfoiwe",1,F},{"awei",99,M}};cout << "******************************\n";showmem(p,5,&Person::name);void (Person::*sh)() = &Person::printmem;cout << "******************************\n";(p[2].*sh)();cout << "******************************\n";(p->*sh)();return 0;}











3 结构体与函数地址输出特性

      C++中把结构体成员地址和函数地址在输出时强制转换成true,但可以通过联合输出函数地址,C语言可以输出地址。因为C++觉得成员地址只能用来访问成员,函数地址只能用来调函数,禁止输出两者地址,保证安全


4 函数重载

根据调用函数的参数类型来决定调用哪一个函数,重载函数的函数名相同,只要参数类型或个数不一样就可以,与返回类型无关重载的;实质是编译器把重载的函数在内部改了名字,表面上是同一个名字


4.1 extern "C"

表示函数名不变,用于跨越模块,编译器,可以被外部调用


4.2 形参默认值

形参的默认值只能靠右写,因为传参数的时候是从左向右传;函数的声明和定义分开时,形参的默认值规定放在声明中,否则会冲突
注意:
void f(int);
void f(int ,bool=true); //二者是重载函数
如果f(20),这样会造成模糊,不知调哪个


5 内联函数

内联只是个请求,不一定实现; 函数在调用时把当前函数的地址保存到栈里,执行完返回来,实参复制到形参, 返回值复制一份传递,这些都要花空间和时间。 宏函数可以实现节约空间和时间,不过宏函数有缺陷。
inline,功能上和宏一样,但并不是简单字符串替换,比宏更安全。可以省去时间空间开销。如果成员函数在头文件里的类声明里实现,编译器会自动给其加上inline

 

0 0