1. //或许,友元是VC++6.0心里永远的痛,对于这个BUG我一直很介意。
    //注:这个程序在VC++6.0里是行不通的,在VS2008里是可以的。
    #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. class Student; //提前引用声明
  6.  
  7. //声明Teacher类
  8. class Teacher {
  9. public:
  10. Teacher(){}
  11. Teacher(int i,string s,char c,int t=):num(i),name(s),sex(c),theachYears(t){}
  12. Teacher(Student);
  13. friend ostream& operator<<(ostream& out,Teacher& te);
  14. private:
  15. int num;
  16. string name;
  17. char sex;//F/M
  18. int theachYears;
  19. };
  20.  
  21. //声明Student类
  22. class Student {
  23. public:
  24. Student(){}
  25. Student(int i,string s,char c,int g=):num(i),name(s),sex(c),grade(g){}
  26. friend Teacher::Teacher(Student);
  27. friend ostream& operator<<(ostream& out,Student& st);
  28. private:
  29. int num;
  30. string name;
  31. char sex;//F/M
  32. int grade;
  33. };
  34.  
  35. //注意:根据惯例,我们喜欢在类的声明前直接写成员函数的实现;
  36. //但是,该构造函数的实现不能写在Student类声明之前,
    //因为它使用了Student类的成员,提前引用声明在这里将不起作用
  37. Teacher::Teacher(Student st)
  38. {
  39. num=st.num;
  40. name=st.name;
  41. sex=st.sex;
  42. theachYears=;
  43. }
  44.  
  45. //重载Teacher类的<<
    // 注意:该构造函数的实现不能写在Student类声明之前,原因同上
  46. ostream& operator<<(ostream& out,Teacher& te)
  47. {
  48. out<<"num="<<te.num<<","<<"name="<<te.name<<","<<"sex="<<te.sex<<","<<"theachYears="<<te.theachYears<<endl;
  49. return out;
  50. }
  51. //重载Student类的<<
  52. ostream& operator<<(ostream& out,Student& st)
  53. {
  54. out<<"num="<<st.num<<","<<"name="<<st.name<<","<<"sex="<<st.sex<<","<<"grade="<<st.grade<<endl;
  55. return out;
  56. }
  57.  
  58. int main()
  59. {
  60. Student s(,"xiaoer",'F',);
  61. cout<<s;
  62. Teacher t=Teacher(s);
  63. cout<<t;
  64. return ;
  65. }

C++中对类的提前引用声明注意事项的更多相关文章

  1. C++中基类对象的引用

    代码: #include <iostream> #include <cstdio> using namespace std; class A{ public: void pri ...

  2. Java中对类的主动引用和被动引用

    1.遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,类如果没初始化就会被初始化,创建对象,读取或设置静态字段,调用静态方法. 2.反射 3.子类初始化前 ...

  3. Java中的类修饰符

    资料主要来源于网络(http://60.28.60.3/zy/java-new/zhishidian/chap3/3.htm) 之前每次写小测试程序的时候,总是把一个类放在一个Java文件中,按理说这 ...

  4. VS中新建类

    通常我们在VS中添加类,比如要声明一个car的类 我们通常在新建的时候会写成CCar,虽然新建出来的文件的名词是car,但是我们使用这个类来声明一个类的时候, 是CCar car; 如果新建类写成Ca ...

  5. 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

      您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...

  6. c++中两个类相互包含引用的相关问题

    在构造自己的类时,可能会遇到两个类相互引用的问题. 例如: class A { int i; B b; }; class B { int i; A a; }; 在这种情况下,这样就会出现一个死循环a. ...

  7. C++中两个类相互包含引用问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class B { in ...

  8. C++类的组合、前向引用声明

    3.5类的组合 Part1.应用背景 对于复杂的问题,往往可以逐步划分为一系列稍微简单的子问题. 解决复杂问题的有效方法是将其层层分解为简单的问题组合,首先解决简单问题复杂问题也就迎刃而解了. 在面向 ...

  9. 多态时最好将基类的析构函数设为virtual、 C++中两个类相互包含引用问题 (转载)

    多态:http://blog.csdn.net/tmljs1988/article/details/8146521 C++中两个类相互包含引用问题:http://blog.csdn.net/leo11 ...

随机推荐

  1. Objc的底层并发API(转)

    本文由webfrogs译自objc.io,原文作者Daniel Eggert.   小引 本篇英文原文所发布的站点objc.io是一个专门为iOS和OS X开发者提供的深入讨论技术的平台,文章含金量很 ...

  2. 邁向IT專家成功之路的三十則鐵律 鐵律二:IT專家專業之道–專精

    在IT技術的領域當中有許多的類別,若要細分那可真是難以一一列舉,但常見的大致有軟體研發工程師.韌體研發工程師.系統分析師.網路工程師.系統工程師.維護工程師.動畫設計師.製圖工程師.以及各類別的專業電 ...

  3. Android 你应该注意的开发规范

    本文由Blankj投稿. Blankjd的博客地址: http://www.jianshu.com/u/46702d5c6978 为了利于项目维护以及规范开发,促进成员之间Code Review的效率 ...

  4. Android开发——内存优化 图片处理

    8.  用缓存避免内存泄漏 很常见的一个例子就是图片的三级缓存结构,分别为网络缓存,本地缓存以及内存缓存.在内存缓存逻辑类中,通常会定义这样的集合类. private HashMap<Strin ...

  5. requests(爬虫常用)库的使用

    Requests库的使用 基于urllib改写的库 示例: import requests response=requests.get('http://www.baidu.com')#get请求 pr ...

  6. 百科知识 hta文件如何打开

    后缀名为hta是什么文件,谢谢? 2006-10-11 21:36 提问者: tanhailong2006 | 浏览次数:2092次 我来帮他解答 输入内容已经达到长度限制 还能输入 9999 字 插 ...

  7. js动态函数

    最近项目中使用百度模板引擎baiduTemplate.js,使用动态函数解析模板中代码. 通过new Function([arg1,arg2,...,argN,]functionBody)方式实现动态 ...

  8. 在没有安装access的电脑上读写.mdb文件

    在微软官方下载MDAC access数据库访问组件即可

  9. 笔记09 saveFileDialog

    C# saveFileDialog用法: #region 保存对话框private void ShowSaveFileDialog(){//string localFilePath, fileName ...

  10. hdparm - get/set SATA/IDE device parameters

    hdparm(8) - Linux man page Name hdparm - get/set SATA/IDE device parameters Synopsis hdparm [ flags ...