1.关于friend
在类里面声明友元函数时,格式形如friend void GetAge(Student &s); 其中符号&可以要,可以不要,不要的话在函数体里面不能改变值。
把整个类全部声明到另一个类作为友元类,则那个类的成员函数都可以访问这个类的成员变量。通常需要在最前声明一下类,如:
#include "stdafx.h" #include <iostream> using namespace std; class Student; class People { private: int age; friend class Student; public: People(int a):age(a){}; }; class Student { private: int age; public: Student(int age_):age(age_){}; friend void GetAge(Student &s); void Show() { cout<<age<<endl; }; void ShowPeople(People &p) { cout<<p.age<<endl; }; }; void GetAge(Student &s) { cout<<s.age<<endl; s.age = 10; } int main(int argc, char* argv[]) { People p(9); Student s(4); GetAge(s); s.Show(); s.ShowPeople(p); return 0; }
2.关于const
当const修饰的成分有两个内容时,是就近原则。如const int *a = &b;这个语句有两个内容,一个是地址a对应的内容,另一个是指针a,这里const离int *中的int近,所以修饰的是这个指针a所对应的值,其不可以修改,而指针a可以修改。如a = &c;而int *const a = &b;这一个const 离int *中的*近,所以对应的是指针。另外,对于const修饰的内容只有一个时,则const放在类型的前后都一样,如int const d = 10;或者const int d
= 10;都修饰的是d里面的内容。
当一个变量被const修饰后,作用只是在这个变量,对前面关联的没有影响。如int a = 100; const int *b = &a;虽然说不能通过*b = xx;来改变a的值,但可以仍然用a = xx来改变值。所以后面的const int *b并没有使前面关联的int a也成const;
常对象只能调用它的常成员函数。所以如果一个类需要被创建成常对象时,需要对其被调用的成员函数后面加上const:
class Girl { private: int age; public: Girl(int a) { age = a; } public: void Show() <span style="color:#ff0000;">const</span> { cout<<age<<endl; } };
如果一个类里面的成员变量被定义成const那么只能通过构造函数的成员变量初始化列表来完成初始化,且在成员函数中不能修改常变量的值。不过非常成员函数也可以访问常成员变量(对象需不是常对象)。
在多态性方面,有const的成员函数和没有const的成员函数不是同一个,如:
class Girl { private: const int age; public: Girl(int a):age(a){} public: void Show() { cout<<age<<endl; } void Show() const { cout<<age+1<<endl; } };
其中常对象调用有const的函数,非常对象调用没有声明是const的函数。不过,如果上面没有常成员函数Show,那么非常对象也可以调用常成员函数。
3.关于声明与定义
声明不分配空间,定义要分配空间。可以声明多次,但定义只能有一次。如类的定义和声明例子:
#include "stdafx.h" #include <iostream> using namespace std; <span style="color:#ff0000;">class Student; class Student;</span> class People { private: int age; friend class Student; public: People(int a):age(a){}; }; class Student { private: int age; public: Student(int age_):age(age_){}; friend void GetAge(Student &s); void Show() { cout<<age<<endl; }; void ShowPeople(People &p) { cout<<p.age<<endl; }; }; <span style="color:#ff0000;">class People;</span> void GetAge(Student &s) { cout<<s.age<<endl; s.age = 10; }
加红的是声明,可以声明多次,但只要后面有了{},就成了定义。