c++复习回顾(2)

本文介绍了C++中的函数定义,包括返回类型、参数传递、递归等。同时,讲解了类和结构体的概念,以及它们之间的区别,提到了构造函数的使用。此外,还讨论了指针和引用的基本操作,如改变变量值、数组指针以及链表的创建和操作。
摘要由CSDN通过智能技术生成

 一.函数

1.函数定义

eg. int fact(int n);

函数返回类型  函数名 (类型  作用参数)

*函数作用过程中,实参的值拷贝给形参,作用结果对外界(实际参数)不造成影响;

*返回仅有一个出口

2.函数没有返回值时 返回类型定义为void

eg. void fact (int n)

{

        printf("%d\n",n);

}

3.多个形参存在时,必须把每个形参的类型都写出来

eg. void fn(int a,int b,char c);

4.函数传入引用类型,对形参的作用会影响到实参,可以返回多个数据

5.在函数中对数组的修改,会影响函数外面的数组,函数一维数组形参可以省略元素个数,调用数组时输入数组名即可

void output(int a[])
{
    for(int i=0;i<10;i++) cout<<a[i]<<endl;
}
int main()
{
    int b[10];
    output(b);

    return 0;
}

6.多维数组除第一维外,其余维度大小必须定义

void fn(int a[][3][4]);

7.函数内部可以调用函数本身,例如函数递归

#include<iostream>
using namespace std;

int fn(int n)
{
    if(n==1||n==2) return 1;
    else return fn(n-1)+fn(n-2);
}//斐波那契数列

int main()
{
    int n;
    cin>>n;
    cout<<fn(n)<<endl;

    return 0;
}

二.类,结构体,指针,引用和指针

1.类和结构体

a)基本概念

#include<iostream>
using namespace std;

const int N = 10;

//把每个类定义为一个人,把一个人的信息放到一块儿
class Person
{
    private://表示在其范围内的变量和函数是私有的,不能在该类外调用
        int age,height;
        double money;
        string books[N];
        

    public://公有的
        string name;

        //定义的函数
        void say()
        {
            cout<<"I'm"<<name<<endl;
        }
        
        int get_age()
        {
            return age;
        }

        void add_money(double x)
        {
            money+=x;
        }
};//定义的类一定要加分号

int main()
{
    Person c;
    c.name="Mike";
    //c.age=18;//错误!年龄在类的定义中是私有的    
    cout<<c.get_age()<<endl;//因为没有赋初始值,输出是随机的

    c.add_money(1000000);

	return 0;
}

*结构体和类大致是相同的,区别在于,在类中,public 不写时,默认为private;而在结构体中默认为public;

b)定义

class Person{

~~~

}c,persons[100];

或是

Person persons[100];

c)类和结构体的构造函数

#include<iostream>
using namespace std;

struct Person
{
    int age,height;
    double money;
    
    //Person() {} ①

    Person(int _age,int _height,double _money)//要求构造函数名称与结构体保持一致
    {
        age = _age;
        height = _height;
        money = _money;
    }
    //构造函数的另一种赋值方法,运行效率会更快一些
    //Person(int _age,int _height,double _money) : age(_age),height(_height),money(_money) {}
};

int main()
{
    Person p(18,187,100.0);//若构造函数,必须传入函数做需要的值
    //Person p;会报错,解决:定义一个空函数,默认调用空函数 ①   
	cout<<p.age<<endl;
	
    return 0;
}

d)赋初值

Person p={18,180}//会按定义的顺序,顺序赋初值,没有赋初值的默认为零

*注意:若有构造函数,赋值个数必须与其中一个函数参数个数相等,以满足一一对应

2.指针和引用

        *全局变量和静态会存放在 堆 中,默认初始值为零;局部变量,放在 栈 中,值随机;堆空间从下往上分配,栈空间从上往下分配

        地址和变量的关系相当于地址是存放变量的下标

a)指针指向存放变量的地址,因此我们可以通过指针来改变变量的值

b)char c='a';

   cout<<(void*)&c<<endl;//输出字符地址

c)

#include<iostream>
using namespace std;

int main()
{
    int a = 10;
    int *p = &a;//定义指针,赋地址,int *表是指针类型,变量是p
    
    cout<<*p<<endl;//*是取出地址中的值的操作符,注意与上面定义指针加以区分

    *p = 12;//改变地址中的值的同时改变了a的值
    cout<<a<<endl;

    return 0;
}

d)数组指针

        int a[3]={1,2,3};

        cout<<a<<endl;//输出的是数组的首地址,数组名就是一个指针

        *相邻地址间隔有所定义类型的字节数决定

        &a[1] <==>a+1

c)int* p = &a;//指针

   int& p = a; //引用,别名,此时p和a等价,可以看成同一个东西

d)链表(算法中的某种结构)

#include<iostream>
using namespace std;

struct Node{
	int val;
	Node* next;
	
	Node(int _val) : val(_val),next(NULL) {}//传值 
};

int main()
{
	//Node node = Node(1);也是一种合法的定义方式 
	//Node* p = &node;先定义一个链表结点node变量,再放到指针中 
	Node* p = new Node(1);//和上两行等价 ,new函数相当于 生成一个结构体,并放到指针中 
	Node* q = new Node(2);
	Node* o = new Node(3);
	
	p->next = q;//p是指针,用'->'访问成员变量 ,否则用'.'访问成员变量,取决于前面变量类型 
	q->next = o;
	
	Node* head = p;//头结点 (地址)存放于head中 
	
	//在开头添加一个新的结点 
	Node* u = new Node(4);
	u->next = head;
	head = u;
	
	//链表的删除 ,遍历不到该点即可,让head的next指向下一个 
	head->next = head->next->next; 
	 
	
	//链表的遍历方式
	for(Node* i = head; i ;i=i->next) cout<<i->val<<endl;
	
	return 0; 
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值