C++ 教程 在线

1989c-function-ctime

Visual Studio 2015运行ctime报错C4996显示ctime为不安全函数,Visual Studio 2015在错误C4996中推荐使用ctime_s代替ctime。

errno_t ctime_s(char *buffer, rsize_t bufsz, const time_t *time);
#include <stdio.h>
#include <time.h>
int main ()
{
   time_t curtime = time(NULL);
   char str[26];
   ctime_s(str, sizeof str, &curtime);
   printf("当前时间 = %s", str);
   return(0);
}

1988returning-values-by-reference

这一段不是很好理解,贴一个其他人写的作为补充。

When a variable is returned by reference, a reference to the variable is passed back to the caller. The caller can then use this reference to continue modifying the variable, which can be useful at times. Return by reference is also fast, which can be useful when returning structs and classes.

我的理解:一个变量被返回其引用的意思是,给了返回变量的一个别名,如教程的例子显示函数给 val[i] 了一个别名。当调用这个函数 setValues(3) 时,返回了这个 val[3] 的别名, 那么我们就可以修改 val[3],所以可以放到等号的左边。

1987returning-values-by-reference

(1)以引用返回函数值,定义函数时需要在函数名前加 &

(2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。

引用作为返回值,必须遵守以下规则:

  • (1)不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。
  • (2)不能返回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。
  • (3)可以返回类成员的引用,但最好是const。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常 量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。

1986passing-parameters-by-references

引用作为函数参数

C++之所以增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能。

C++ 函数传参:

(1)将变量名作为实参和形参。这时传给形参的是变量的值,传递是单向的。如果在执行函数期间形参的值发生变化,并不传回给实参。因为在调用函数时,形参和实参不是同一个存储单元。// 同 c

(2) 传递变量的指针。形参是指针变量,实参是一个变量的地址,调用函数时,形参(指针变量)指向实参变量单元。这种通过形参指针可以改变实参的值。// 同 c

(3) C++提供了 传递变量的引用。形参是引用变量,和实参是一个变量,调用函数时,形参(引用变量)指向实参变量单元。这种通过形参引用可以改变实参的值。

1985cpp-passing-pointers-to-functions

我来给一个简洁版的演示过程:

#include<iostream>
using namespace std;
int get(int *p)
{
    *p = 5;
    return *p;
}
int main()
{
    int a = 1;
    cout<<a<<endl;
    get(&a);
    cout<<a<<endl;
    return 0;
}