C++ 教程 在线

1999cpp-class-member-functions

C++中函数调用非虚成员函数、调用虚函数的区别:

1.调用非虚成员函数:和调用非成员函数一样,通过对象确定对象所属的类,然后找到类的成员函数。此过程不会涉及到对象的内容,只会涉及对象的类型,是一种静态绑定。

2.调用虚函数与调用非虚成员函数不同,需同过虚函数表找到虚函数的地址,而虚函数表存放在每个对象中,不能再编译期间实现。只能在运行时绑定,是一种动态绑定。

1998cpp-class-member-functions

类中的成员函数与 inline

定义在类中的成员函数缺省都是内联的,如果在类定义时就在类内给出函数定义,那当然最好。如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联的。例如:

class A
{
    public:void Foo(int x, int y) {  } // 自动地成为内联函数
}

将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程风格,上例应该改成:

// 头文件
class A
{
    public:
    void Foo(int x, int y);
}
// 定义文件
inline void A::Foo(int x, int y){} 

inline 是一种用于实现的关键字

关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

如下风格的函数 Foo 不能成为内联函数:

inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y){}

而如下风格的函数Foo 则成为内联函数:

void Foo(int x, int y);
inline void Foo(int x, int y) {}  // inline 与函数定义体放在一起

更多 inline 用法可以查阅:C++ 中的 inline 用法

1997cpp-class-member-functions

:: 叫作用域区分符,指明一个函数属于哪个类或一个数据属于哪个类。

:: 可以不跟类名,表示全局数据或全局函数(即非成员函数)。

int month;//全局变量
int day;
int year;
void Set(int m,int d,int y)
{
    ::year=y; //给全局变量赋值,此处可省略
    ::day=d;
    ::month=m;
}
Class Tdate
{
    public:
        void Set(int m,int d,int y) //成员函数
        {
            ::Set(m,d,y); //非成员函数
        }
    private:
        int month;
        int day;
        int year;
}

来源:钱能%20C++程序设计教程——设计思想与实现

1996c-function-difftime

在Visual Studio 2015里使用Sleep函数首字母S必须大写,必须#include ,Sleep括号里的数字为毫秒,5秒的话写成Sleep(5000)。

#include <iostream>
#include <ctime>
#include <Windows.h>
using namespace std;
int main()
{
  time_t start_t, end_t;
  time(&start_t);
  Sleep(5000);
  time(&end_t);
  cout << start_t << endl;
  cout << end_t << endl;
  cout << difftime(end_t, start_t) << endl;
  system("pause");
  return 0;
}

1995c-function-gmtime

在Visual Studio 2015里使用gmtime报错C4996提示gmtime不安全,推荐使用gmtime_s。

#include <iostream>
#include <ctime>
using namespace std;
int main()
{
  time_t rawtime;
  struct tm info;
  time(&rawtime);
  gmtime(&rawtime);
  gmtime_s(&info, &rawtime);
  printf("伦敦:%2d:%02d\n", info.tm_hour, info.tm_min);
  system("pause");
  return 0;
}