精华内容
下载资源
问答
  • C++自定义函数返回值

    2020-10-31 17:05:11
    #include <iostream> #include <string> #include <Windows.h> using namespace std; double light_year(double w ) { w = w * 63240; return w; } int main(void) { ... light_year
    #include <iostream>
    #include <string>
    #include <Windows.h>
    
    using namespace std;
    
    double light_year(double w ) {
    	w = w * 63240;
    	return w;
    }
    int main(void) {
    	double g=0;
    	double t=0;
    	cout << "请输入光年:";
    	cin >> g;
    	light_year(g);
    	t = light_year(g);
    	cout << "天文单位为:" << t << endl;
    	system("pause");
    	return 0;
    }
    

    纯属怕自己忘记了,做个小笔记

    展开全文
  • C/C++自定义函数返回值

    千次阅读 2019-04-04 08:45:11
    2、调用的子函数没有返回值,用void,否则会报错子函数没有返回值。 ①有返回值 根据返回值类型来定义为int,并且在子函数结尾一定要写上return result(需要返回的值) int main中需要定义一个新的变量去接收子...

    1、调用函数一定是在int main()外的

    2、调用的子函数没有返回值,用void,否则会报错子函数没有返回值。

    ①有返回值

    根据返回值类型来定义为int,并且在子函数结尾一定要写上return result(需要返回的值)

    int main中需要定义一个新的变量去接收子函数返回的值

     

    变量地址作为返回值

    全局变量的生命期是永恒的,如果返回一个局部变量的地址会出现问题(变量在子函数中或者在if语句后出现都会随着程序的运行时变量失效)

    #include <stdio.h>
    
    int* get()
    {
        int num=1;
        return &num;
    }
    
    int main()
    {
        int* p=get();
        *p=12;        //p指向的变量已经失效,不能用星号操作
        return 0;
    }

    用法错误 ,因为get()函数返回的是一个局部变量的地址,当get()获取局部变量的地址返回后,局部变量num的生命周期结束,从而使指针p指向了一个无效的变量。正确程序如下,应该把num定义为全局变量

    #include <stdio.h>
    int num=1;
    int* get()
    {
        return &num;
    }
    
    int main()
    {
        int* p=get();
        *p=12;
        return 0;
    }

     

    再如

    int main()
    {
        int* p=0;
        if(1)
        {
            int a=123;        //a生命期开始
            int* p=&a;
        }                    //a生命期结束
        printf("%d\n",*p);
        return 0;
    }

    ②返回值为bool类型(直接返回true或false )

    // 判断a,b,c组成的三角形是否为直角三角形
    bool check(int a, int b, int c)
    {
    	int aa = a * a;  // a的平方
    	int bb = b * b;
    	int cc = c * c;
    	if (aa + bb == cc || aa + cc == bb || bb + cc == aa)
    	{
    		return true;
    	}
    	return false;
    }

     

    3、可以不用传入形参

    void test()
    {
    	for (int i = 1; i <= 10; i++)
    	{
    		printf("%d \n", i);
    	}
    }

    4、子函数的传值和传地址

    ① 传入变量值

    #include <stdio.h>
    #include <string.h>
    
    void test(int a)
    {
    	a = a * a;
    }
    
    int main()
    {
    	int a = 10;
    	test(a);
    	printf("a: %d \n", a);
    
    	getchar();
    	return 0;
    }

    test(a)意思是把a的值传给函数,而不是说把a这个变量传给函数 ,通过编译器执行结果如下:

    根据编译结果可知,虽然mian中的变量a与形参a名字上是相同的,但是对应着不同的内存地址,牢记:子函数对a值的修改不会影响到main中的a值

    无论 test () 函数里面如何操作,对main()函数里的 a 没有影响,所以 a 值仍为 10

    ②传地址

    
    #include <stdio.h>
    #include <string.h>
    
    void test(int* a)
    {
    	int n = *a;
    	*a = n * n;
    }
    
    int main()
    {
    	int a = 10;
    	test(&a);
    	printf("a: %d \n", a);
    
    	getchar();
    	return 0;
    }

    传入变量地址(形参为一个int型变量地址),输出地址中的值a

    在 test() 里,*a 的值变为100

    所以最终输出的值为100

     

    return语句只能有一个返回值

    但是这个返回值可以是一个结构体或者是一个类,而结构体和类中可以容纳很多信息. 
    或者你也可以参考函数参数的方式来实现返回你所需要的信息,可以是多个.

    展开全文
  • 复习的时候手敲了一个程序想看看编译器是怎么调析构函数的,结果出问题了。 问题是这样的: #include <bits/stdc++.h> using namespace std; typedef long long ll; class Complex { public: int r, i; ...

    最近期末考试,忙着复习,ACM暂时鸽了。
    复习的时候手敲了一个程序想看看编译器是怎么调析构函数的,结果出问题了。
    问题是这样的:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    class Complex
    {
    public:
        int r, i;
    public:
        Complex(int a, int b): r(a), i(b) { cout << "Constructor called." << endl; }
        ~Complex() { cout << "Destructor called." << endl; }
        Complex(const Complex &a) { r = a.r, i = a.i; cout << "Copy constructor called." << endl; }
        Complex operator +(Complex x1);
    };
    Complex Complex::operator +(Complex x1)
    {
        return Complex(r + x1.r, i + x1.i);
    }
    int main()
    {
        Complex a(1, 2);
        a = a + a;
        return 0;
    }
    

    运行完结果是:

    Constructor called.
    Copy constructor called.
    Constructor called.
    Destructor called.
    Destructor called.
    Destructor called.
    

    按照书上讲的来说,这个程序首先调用一次构造函数创建对象a,之后在主程序第二行调用复制构造函数把a传给形参x1,之后在函数中调用一次构造函数生成加法的结果,之后再调用一次复制构造函数把这个结果存到一个临时对象里,然后析构结果和x1,之后把临时对象赋值给a,最后析构临时对象。所以理想结果应该是:

    Constructor called.
    Copy constructor called.
    Constructor called.
    Copy constructor called.
    Destructor called.
    Destructor called.
    Destructor called.
    Destructor called.
    

    但是很明显程序运行结果少了一次复制构造函数和析构函数的调用。百思不得其解,想了一个下午,最后通过询问神奇海螺发现C++对于返回值有个叫做返回值优化的东西。
    这篇文章讲得很详细:C++中临时对象及返回值优化

    具体来说返回值优化有两种实现方式。第一种是对于已经存在的对象a,在调用函数对该对象赋值是编译器会偷偷往函数里多塞一个形参,把a的地址传进去,之后直接在函数里对a赋值。第二种不再赘述,上面这篇博客写得比较详细。

    把程序的

    a = a + a;
    

    改成

    a + a;
    

    后仍然没有调用复制构造函数。应该采用的是第二种方法。

    有错误欢迎指出。

    展开全文
  • C++函数返回值自定义类型情况

    千次阅读 2018-06-20 11:19:53
    C++中,函数返回值自定义类型的情况主要分为两种,一种是非引用类型的自定义类;另一种是引用类型的自定义类。1 返回值自定义类的非引用类型在这种情况下,使用该类拷贝构造函数,根据返回值来创建该类的新...

    C++中,函数的返回值是自定义类型的情况主要分为两种,一种是非引用类型的自定义类;另一种是引用类型的自定义类。

    1 返回值是自定义类的非引用类型

    在这种情况下,使用该类拷贝构造函数,根据返回值来创建该类的新的对象。

    class Person {
    
    Person(int age) {//构造函数
    
    cout << "param constructor!" << endl;
    
    mAge = age;
    
    }
    
    public:
    
    Person(const Person& person) { //拷贝构造函数
    
    mAge = person.mAge;
    
    }
    
    public:
    
    int mAge;
    
    };
    
    Person MyFunc() {//返回值为非引用自定义类的函数
    
    Person q(10);
    
    return q;
    
    }

    此时,使用如下代码调用MyFunc()函数

    Person p = MyFunc();

    MyFunc()函数返回了Person类的变量q之后,会调用Person的拷贝构造函数,将q的值拷贝给p需要注意的是,以上代码并没有调用Person类的赋值表达式。即使不处理MyFunc()函数的返回值,直接调用MyFunc()函数

    MyFunc();

    此时依然会调用Person的拷贝构造函数,只是此时使用Person的拷贝构造函数将q的值拷贝给一个临时变量。

    2 返回值是自定义类的引用类型

    当函数的返回值是自定义类的引用类型时

    Person& MyFunc() {//返回值为引用自定义类的函数
    
    Person q(10);
    
    return q;
    
    }

    如果不对MyFunc()函数的返回值进行处理,

    MyFunc();

    此时,不会调用Person类的拷贝构造函数。而将对MyFunc()函数的返回值赋值给其它对象,

    Person p = MyBusiness();

    此时依然会调用Person类的拷贝构造函数。

    展开全文
  • #include using namespace std; //定义类 ...//定义默认构造函数 ...还有就是返回值作为左值的问题,c++提供的默认数据类型作为返回值时 不能作为左值,用户自定义数据类型可以,有什么要求和注意事项吗?
  • 作者:子宇24链接:https://www.cnblogs.com/dishengAndziyu/p/10920150.html1、本文介绍一个新的概念,它是一个重要的概念,并且是 C++ 中的一个高级主题;2、问题:如何判断一个函数(不是自己写的,有可能是第三方...
  • c++自定义函数

    2014-03-04 21:52:07
    #include #include using namespace std;...//定义一个无返回值函数test原型 参数类型为int int main() { int count; cout cin >> count; test(count); return 0; } //实现test函数 void test(int n){ cout
  • c++自定义函数可以分作两种 有返回值和无返回值,还有无参数函数 函数一般包括1.函数原型,一般函数原型写在main()函数之前,主要定义 返回值的数据类型,函数名,参数类型也就是函数原型只是描述发送给函数的...
  • C++函数返回值

    千次阅读 2016-03-24 11:08:44
    C++函数可以返回多种类型,大致可分4种: 1. 返回void(无返回值); 2. 返回对象(内置类型对象和自定义对象); 3. 返回指针(普通指针和函数指针); 4. 返回引用; 返回void(无返回值) void f() { //默认...
  • C++函数返回值类型

    千次阅读 2014-09-05 20:24:55
    C++语言的函数返回值类型可以分为内部类型和自定义类型两大类。  在函数返回内部类型中不能返回数组类型但可以返回指向数组的指针,同样也可以返回指向函数的函数指针。如果希望返回值可以作为左值(即可以放在...
  • C++函数返回值是局部变量时,该返回值可能是值类型、指针类型和引用类型。 以自定义类型MyStruct为例: struct MyStruct { int x; int y; }; 1 返回值自定义结构的值类型 定义一个返回值为MyStruct的函数...
  • 函数的用法需要注意的一点就是函数返回值返回的时候,返回类型不能使用自己定义的函数名称,因为不是内置函数,所以用使用起来会报错,返回的类型需要和你定义的形参的类型相同,本文定义的Name是char*类型的,...
  • c++函数返回值的初始化

    千次阅读 2018-06-20 23:45:10
    引言 c++函数返回值,如int, char, float等内建类型可以使用寄存器返回。但是如果我返回了自定义的一个类呢?那么函数返回时当前栈帧释放了,如果保存返回对象的值。它又在什么时候初始化? 让我们从汇编层次来看...
  • C++语言的函数返回值类型分为两类: 内部类型 自定义数据类型 左值:可以放到赋值运算符的左边,能对表达式取地址、或具名对象/变量。一般指表达式结束后依然存在的持久对象。 右值:赋值运算符的右边,不能对...
  • 前面我们介绍了函数返回值是内置值类型、自定义值类型和引用类型的处理方法。本文将介绍函数的返回值是const指针类型时的处理方法。1 指向常量的指针指向常量的指针(pointer to const)不能用于改变其所指向对象的...
  • 2015/05/28  lua调用c++接口,返回给lua函数的是压入栈的内容,可以有多个返回值。但是c++接口本身也是有...(1)c++自定义类 int Test::getMsg(lua_State* L){ lua_pushnumber(L, 100); lua_pushnumber(L,...
  • 传值(pass by value):即形参接收实参传递过来的值,如果是自定义类型,要调用拷贝构造函数函数处理的是形参的值。 传引用(pass by reference):引用表示与原对象...C++函数返回值——返回引用类型&非引用类型
  • 在lua中是以函数指针的...也就是说,在C++中定义函数时必须以lua_State为参数,以int为返回值才能被Lua所调用。由于lua_State是支持栈的, 所以通过栈可以传递无穷个参数, 大小只受内存大小限制,而返回的int值也只...
  • 很多人在学习C++ 的过程中应该会留意到返回值的问题,特别是习惯用:int main() 的猿类同伴们。我们需要在函数结尾写个返回值。 int main(){ return 0; } 接下来就给大家简单介绍一下返回值。 一、返回值...
  • C++ 函数返回值声明为const的原因

    千次阅读 2012-05-20 10:59:37
    其目的就是为了实现用户自定义类型与内置类型最大限度的保持一致性。 比如操作 a+b = c; 对于内置类型在编译时,会弹出不能对lvalue进行赋值的错误;然而对于用户自定义类型,比如...解决办法就是给函数返回值加上
  • 函数返回值作为左值问题

    千次阅读 2019-05-05 20:45:55
    C++语言的函数返回值类型可以分为内部类型和自定义类型两大类。 如果函数返回内部类型并且希望返回值可以作为左值(即可以放在赋值操作符左边的),那就必须返回引用类型。 而在函数返回自定义类型(即返回类类型)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 473
精华内容 189
关键字:

c++自定义函数返回值

c++ 订阅