类内定义与内联函数

像下面这种函数名与函数体都写在类里面的函数形式被称作类内定义,编译器编译的时候会把它默认成内联函数。

class Student
{
public:
void setAge(int _age){age = _age;}
int getAge(){return age;}
void study(){}
private:
string name;
int age;
};

类外定义

成员函数的函数体写在类的外面,这样叫做类外定义。

类外定义分类:

      同文件类外定义:函数的定义与函数体写在同一个文件里。

      分文件类外定义:函数的定义与函数体写在不同的文件里。

类外定义方法:

      函数类型  类名 :: 函数名

      void Teacher::teach()

代码示例1:同文件类外定义

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std; /*************************************************************************
定义一个Teacher类,要求分别采用同文件爱你类外定义和分文件类外定义
的方式完成,具体要求如下: 数据成员:
姓名
年龄
性别 成员函数:
数据成员的封装函数
授课teach *************************************************************************/ class Teacher
{
public:
// 声明成员函数,把所有的成员函数都罗列出来
void setName(string _name);
string getName();
void setGender(string _gender);
string getGender();
void setAge(int _age);
int getAge();
void teach(); private:
string m_strName;
string m_strGender;
int m_iAge;
}; // 类外定义,写出成员函数的函数体
void Teacher::setName(string _name)
{
m_strName = _name;
}
string Teacher::getName()
{
return m_strName;
}
void Teacher::setGender(string _gender)
{
m_strGender = _gender;
}
string Teacher::getGender()
{
return m_strGender;
}
void Teacher::setAge(int _age)
{
m_iAge = _age;
}
int Teacher::getAge()
{
return m_iAge;
}
void Teacher::teach()
{
cout<<"现在上课!"<<endl;
} int main(void)
{
Teacher t; // 实例化对象
t.setName("cjj");
t.setGender("男");
t.setAge(); cout<< t.getName()<< " " << t.getGender() << " " << t.getAge() << endl;
t.teach(); system("pause");
return ;
}

代码示例2:分文件类外定义

把上面同文件类外定义的代码分别放到三个不同的文件里,在根据不同文件调用的函数、关键字,加上需要的头文件。

demo.cpp:

#include <iostream>
#include <stdlib.h>
#include <string>
#include "Teacher.h"
using namespace std; /*************************************************************************
定义一个Teacher类,要求分别采用同文件爱你类外定义和分文件类外定义
的方式完成,具体要求如下: 数据成员:
姓名
年龄
性别 成员函数:
数据成员的封装函数
授课teach *************************************************************************/ int main(void)
{
Teacher t; // 实例化对象
t.setName("cjj");
t.setGender("男");
t.setAge(); cout<< t.getName()<< " " << t.getGender() << " " << t.getAge() << endl;
t.teach(); system("pause");
return ;
}

Teacher.h:

#include<string>
using namespace std; class Teacher
{
public:
// 声明成员函数,把所有的成员函数都罗列出来
void setName(string _name);
string getName();
void setGender(string _gender);
string getGender();
void setAge(int _age);
int getAge();
void teach(); private:
string m_strName;
string m_strGender;
int m_iAge;
};

Teacher.cpp:

#include"Teacher.h"
#include<iostream>
using namespace std; // 类外定义,写出成员函数的函数体
void Teacher::setName(string _name)
{
m_strName = _name;
}
string Teacher::getName()
{
return m_strName;
}
void Teacher::setGender(string _gender)
{
m_strGender = _gender;
}
string Teacher::getGender()
{
return m_strGender;
}
void Teacher::setAge(int _age)
{
m_iAge = _age;
}
int Teacher::getAge()
{
return m_iAge;
}
void Teacher::teach()
{
cout<<"现在上课!"<<endl;
}

两种类外定义的输出结果相同:

C++ 类外定义的更多相关文章

  1. C++类的成员函数(在类外定义成员函数、inline成员函数)

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...

  2. 如何利用c++编写不能被继承、但可以在类外定义对象的类

    #include <iostream> #include<string> #include<map> #include<vector> #include ...

  3. c++学习笔记之基础---类内声明函数后在类外定义的一种方法

    在C++的“类”中经常遇到这样的函数, 返回值类型名 类名::函数成员名(参数表){ 函数体.} 双冒号的作用 ::域名解析符!返回值类型名 类名::函数成员名(参数表) { 函数体. } 这个是在类 ...

  4. MFC 如何在一个类中使用在其他类中定义的变量或函数

    [声明:本文的知识点来源于网络,参考网址:https://blog.csdn.net/bill_ming/article/details/7407848] [以下三种方法亲测有效,可以根据具体情况来选 ...

  5. 为什么static数据成员一定要在类外初始化?(转)

    1.避免重复定义和初始化 <<c++ primer>>说在类外定义和初始化是保证static成员变量只被定义一次的好方法. 但,为什么static const int就可以在类 ...

  6. C++ 类的定义与实现

    摘自这篇博客https://blog.csdn.net/xulingxin/article/details/81335030   一."类" 的介绍     在C++中, 用 &q ...

  7. c++利用初始化列表在类内部和类外部定义构造函数的区别

    case 1:在类外定义构造函数,所有data member都在初始化列表中进行初始化. class SupportClass { public: SupportClass() { cout < ...

  8. JavaScript 类的定义和引用 JavaScript高级培训 自定义对象

    在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等.     一,概述 在Java语言中 ...

  9. Ruby学习: 类的定义和实例变量

    ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的. 一.类的定义语法 类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾. 类中的方法以 ...

随机推荐

  1. [nowcoder]contest/172/C保护

    C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为首都.国家有m支军队,分别守卫一条路径的城市.具体来说,对于军队i,他守卫的城市区域可以由一对二元组(xi,yi) ...

  2. ISSCC 2017论文导读 Session 14: A 28nm SoC with a 1.2GHz Prediction Sparse Deep-Neural-Network Engine

    A 28nm SoC with a 1.2GHz 568nJ/Prediction Sparse Deep-Neural-Network Engine with >0.1 Timing Erro ...

  3. Eclipse插件Fat Jar

    1.安装 1)Eclipse在线更新方法 Help > Install New Software > Add, name:Fat Jar location:http://kurucz-gr ...

  4. 连接数据库的DBUtils工具类

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  5. redis高可用 - redis集群

    redis-sentinel方案提供了单点的高可用解决方案,但是当数据量和业务量极速增长时,单点的reids不可能无限的纵向扩容(增大内存),这个时候就需要redis有集群的能力来扛. redis集群 ...

  6. mysql中InnoDB存储引擎的行锁和表锁

    Mysql的InnoDB存储引擎支持事务,默认是行锁.因为这个特性,所以数据库支持高并发,但是如果InnoDB更新数据的时候不是行锁,而是表锁的话,那么其并发性会大打折扣,而且也可能导致你的程序出错. ...

  7. appium+pytest+allure+jenkins 如何实现多台手机连接

    使用appium可以实现app自动化测试,我们之前是连接一台手机去运行,如何同时连接多台手机呢?很多人可能想到的是多线程(threading).今天分享一种比多线程更简单的方法,虽然不是多台手机同时运 ...

  8. 将 Spring boot 项目打成可执行Jar包,及相关注意事项(main-class、缺少 xsd、重复打包依赖)

    最近在看 spring boot 的东西,觉得很方便,很好用.对于一个简单的REST服务,都不要自己部署Tomcat了,直接在 IDE 里 run 一个包含 main 函数的主类就可以了. 但是,转念 ...

  9. JAVA中的>>和>>>号以及<<号的作用

    public static void main(String[] args) { //右移2位,输出结果为2.二进制1000右移2位变为0010 System.out.println(8>> ...

  10. 升级OPENSSH 和 OPENSSL

    升级OPENSSH 和 OPENSSL   首先安装telnet服务,防止在操作过程中导致ssh远程中断   # 安装Telnetyum install telnet-server -y chkcon ...