C++学习之路: class类外的成员函数定义 和 友元 的讨论

引言:成员函数定义在类内和类外的区别在于是否内联展开。

定义在类内一般都是内联展开的, 节省了调用函数的开销。如果函数体过于庞大,编译器会忽视内联建议

如果定义在类外,需要在类内声明,则程序运行时 是采用调用的方式 访问该函数,是非内联的方式。

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 using namespace std;
 5
 6 class Student
 7 {
 8     public:
 9         Student();
10         Student(int id, const string name, int age);
11         void print() const;
12     private:
13         int id_;
14         string name_;
15         int age_;
16 };
17
18 Student::Student()
19     :id_(0),
20      name_(""),
21      age_(0)
22 {
23 }
24
25 Student::Student(int id,
26                  const string &name,
27                  int age)
28     :id_(id),
29      name_(name),
30      age_(age)
31 {
32
33 }
34
35 void Student::print() const
36 {
37     cout << "hello" << endl;
38 }

下面我们 讨论一下友元 和 类对象的 关系。

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 using namespace std;
 5
 6 class Test
 7 {
 8     public:
 9         friend class Other; //声明Other是Test的朋友
10         friend void bar(const Test &t);
11     private:
12         int x_;
13         int y_;
14 };
15
16 class Other
17 {
18     public:
19         void foo(Test &t)
20         {
21             t.x_ = 10;
22             t.y_ = 20;
23         }
24 };
25
26 void bar(const Test &t)
27 {
28     cout << t.x_ << endl;
29 }
30
31 int main(int argc, const char *argv[])
32 {
33     Test t;
34     return 0;
35 }

通过上面的代码我们可以看到, 友元是可以直接访问,对象的私有数据的,   你只需要在class中声明一下 XX 类 是我的朋友即可, 关键字为friend。

函数也可以用 friend 关键字 来声明,则该函数可以直接访问 class 内的private 数据。

时间: 2024-08-26 23:35:44

C++学习之路: class类外的成员函数定义 和 友元 的讨论的相关文章

类的封装性和信息隐蔽—类声明和成员函数定义的分离

在面向对象的程序开发中,一般做法是将类的声明(其中包含成员函数的声明)放在指定的头文件中,用户如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,以减少工作量,节省篇幅,提高编程的效率. 由于在头文件中包含了类的声明,因此在程序中就可以用该类来定义对象.由于在类体中包含了对成员函数的声明,在程序中就可以调用这些对象的公用成员函数.为了实现上一节所叙述的信息隐蔽,对类成员函数的定义一般不放在头文件中,而另外放在一个文件中. 例如,可以分别写两个文件: //student.h

一步一步学习C++(类)之成员函数的特性

在类体中说明的函数作为类的成员,称为成员函数.一般的成员函数,它是根据某种类的功能的需要来定义的.除此之外,又讨论了一些特殊的成员函数:构造函数.析构函数.拷贝初始化构造函数等.本节讨论除成员函数定义与说明之外的其它一些特殊属性. 一.内联函数和外联函数 类的成员函数可分为内联函数与外联函数.内联函数是指定义在类体内的成员函数,即该函数的定义放在类的体内.而对成员函数的说明放在体内,其函数的定义放在体外称之为外联函数.如果使外联函数转变为内联函数,只须在函数头部左端加上关键字inline即可.

C++ 中模板类的模板成员函数在类外定义

因为很多书都没讲到这种情况, 曾经有这个问题但一直没答案,所以我一直以为模板类的模板成员函数只能在类内定义,直到我在某个开源代码里看到原来要加两个 template<>  ............ (T_T) template<typename T1> class MyObjectT { public: template<typename T2> void Foo(T2 v); }; template<typename T1> template<typ

(继承及其访问限定符)&&(派生类及其默认成员函数)&&(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

(继承及其访问限定符)&amp;&amp;(派生类及其默认成员函数)&amp;&amp;(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

创建一个三角形类并且通过成员函数计算三角形的周长和面积《1》

首先定义一个三角形类 class Triangle//三角形类 { public: double getA(void);//得到a的值 double getB(void);//得到b的值 double getC(void);//得到c的值 void setA(double x);//设置a的值 void setB(double y);//设置b的值 void setC(double z);//设置c的值 bool isTriangle(void);//取三边的值 double Perimeter

创建一个三角形类并且使用成员函数计算三角形的周长和面积《2》

首先创建一个三角形类 class Triangle//三角形类 { public: void Setabc(double x, double y, double z);//置三边的值,注意要能成三角形 void Getabc(double *x, double *y, double *z);//取三边的值 double Perimeter(void);//计算三角形的周长 double Area(void);//计算并返回三角形的面积 private: double a, b, c; //三边为

为什么通过空指针(NULL)能够正确调用类的部分成员函数

#include <iostream> using namespace std; class B { public: void foo() { cout << "B foo " << endl; } void pp() { cout << "B pp" << endl; } void FunctionB() { cout << "funB" << endl; }

c++ 类中模版成员函数

C++函数模版与类模版. template <class T> void SwapFunction(T &first, T &second){ }//函数模版 template <class T>//类模版 class CTemplate{ public: void SWap(T &first, T &second){ } }; #include <iostream> class Single{ public: static Single