转-C++快速入门

转自CSDN博客,u010425776,http://m.blog.csdn.net/u010425776/article/details/45134577

引用变量

引用一个变量就是定义了一个变量,和原来的变量使用同一个值。引用变量将值改变,原来这个变量的值也随之改变。 
它和传地址的性质一致。

/**
*定义一个引用类型的变量b,引用了变量a
*/
int a;
int &b = a;
  • 1
  • 2
  • 3
  • 4
  • 5

形式参数传引用

/**
*声明函数xxx
*/
void xxx(int &);

/**
*实现函数xxx
*/
void xxx(int &x){
    x++;
}

/**
*执行函数xxx
*/
int main(){
    int a = 20;
    xxx(a);//int &x = a;传递引用
    cout<<a;//结果为21
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

形式参数传地址

/**
*声明函数xxx
*/
void xxx(int *);

/**
*实现函数xxx
*/
void xxx(int *x){
    *x++;
}

/**
*执行函数xxx
*/
int main(){
    int a = 20;
    xxx(&a);//传递地址
    cout<<a;//结果为21
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

形式参数传值

给函数传值就相当于将值拷贝一份给这个函数,这个函数进行操作的这个值和原本的这个值一点关系都没有,因此原本的值不变。

/**
*声明函数xxx
*/
void xxx(int );

/**
*实现函数xxx
*/
void xxx(int x){
    x++;
}

/**
*执行函数xxx
*/
int main(){
    int a = 20;
    xxx(a);//传值
    cout<<a;//结果为20
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

默认值的参数传递

/**
*函数的声明
*/
int xxx(int a,double b=0,int c=10);
  • 1
  • 2
  • 3
  • 4

默认值在声明的时候设置; 
默认值可以有可以没有,但有默认值的参数必须出现在右侧。

函数的不同类型

根据返回值类型的不同,函数可以分成三种类型。

  • 返回基本数据类型
  • 返回一个静态变量的地址
    int *fun(){//要将函数名前加上*
        static int n;
        n++;
        return &n;//返回一个地址
    }
    • 1
    • 2
    • 3
    • 4
    • 5
  • 返回一个静态变量的别名
int &fun(){//要将函数名前加上&
    static int n;
    n++;
    return n;//返回一个引用
}
  • 1
  • 2
  • 3
  • 4
  • 5

內联函数

将被调用函数的函数体直接嵌入在被调用处,这种函数叫做內联函数。 
在函数的最前面加上inline就是內联函数了。 
內联函数的函数体内不能有循环、switch、复杂的if-else。

模版函数

/**
*只要在函数定义的时候进行以下操作,函数调用的时候照常使用即可
*/
template <typename T>
T add(T x,T y){
    return x+y;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

指向函数的指针

函数也是有地址的,因为函数的代码也需要放在一片连续的存储空间中。而函数的地址就是函数名。

函数指针的声明:

//已有函数声明
double fun(int,int,double);
//声明函数指针p,并将p指向fun的代码区域
double (*p)(int,int,double)=fun;
  • 1
  • 2
  • 3
  • 4

此时,用p和用fun效果是一模一样的。

include指令

  • #include<文件名> 
    包含C++库函数头文件
  • #include”文件名” 
    包含自己编写的文件

/#define指令

define指令又叫做宏指令,遇到宏名,用宏内容原封不动地替换宏名。宏内容中可以包含标点符号。 
当宏名出现在字符串中不进行替换。 
“undef 宏名“表示宏替换在此处终止。

条件编译

/**
*如果定义了xx,就编译……,否则就编译……
*/
#ifdef/#ifndef xx
……
else
……
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

条件编译可以防止头文件地嵌套包含,从而避免重复编译。

#ifndef HD
    #define HD
……
#endif
  • 1
  • 2
  • 3
  • 4

函数的定义

成员函数可以在类内只写函数原型,而定义写在类的外边。当函数的定义写在类的外边时,要在函数名的前面加上类名:void 类名::函数名(参数){ 
函数实现 

面向对象程序设计的多文件组织

一个源程序要分成三个文件,一个.h文件,存放类的声明;一个.cpp文件,存放类的实现;一个.cpp文件,存放类的使用。

对象的使用

//与java中不同,c++中只要这么写,对象就已经创建好了。
Student stu1,stu2;

//没有使用new创建的对象之间可以整体赋值
stu1 = stu2;//这样就是把stu2各个成员变量的值一一复制给了stu1
  • 1
  • 2
  • 3
  • 4
  • 5

对象调用成员的两种方式

//对象调用成员,通过.来调用
stu1.getName();
stu1.name

//对象的地址通过->来调用
&stu1->getName();
&stu1.name;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

this指针 
每个成员函数的行参表中,都隐藏着代表本类对象的this指针

void Student::setName(string name,Student *this){
    this->name = name;
}
  • 1
  • 2
  • 3

使用new创建对象

Student *stu = new Student();
//使用new创建的是对象的指针,必须在对象前加上*
//使用new会调用相应的构造函数,也可以没有括号表示调用空参构造器。
  • 1
  • 2
  • 3

析构函数 
析构函数是用来完成对象在生命周期结束前释放内存空间用的。在对象的生命周期结束前会由系统自动调用。 
析构函数的特点:

  • 是一个公有函数
  • 函数名与类名相同
  • 没有参数
  • 没有返回值
  • 用~开头
  • 不定义析构函数系统会自动生成一个空参的、不做任何操作的析构函数。
  • 当使用new创建对象时就必须定义析构函数,在析构函数内部用delete释放内存空间
#include<iostream>
using namespace std;
class Student{
    private:
        char *name;
    public:
        Student(char *name);
        ~Student();
        void show(){
            cout<<"name:"<<name<<endl;
        }
}

Student::Student(char *name){
    if(name){
        name = new char[strlen(name)+1];//创建一个char类型的数组,长度是name的长度+1
        this->name = name;
    }
    this->show();
}
~Student::Student(){
    if(this->name)
        delete []name;//释放数据name的空间
}

int main(){
    Student stu1("chai");//这是Student stu1 = new Student("chai")的简写形式
    Student stu2("zhang");
    return 0;
}//当执行到这里的时候,系统会自动调用两次析构函数,将stu1、stu2的空间释放掉。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

拷贝构造函数

  • 浅拷贝 
    在未手动定义拷贝构造函数的情况下,系统会自动提供默认的浅拷贝构造函数。
Student s1;//已经创建了对象s1
Student s2(s1);//将s1浅拷贝给s2
Student s2 = s1;//与上面等价
  • 1
  • 2
  • 3

浅拷贝是将s2的指针指向s1所在的区域,从而s1与s2共享一块区域。 
浅拷贝会存在一个问题,由于拷贝前后的两个对象同时指向同一块内存空间,所以当析构这两个对象的时候,同一片空间会被析构两次,如果第一次将存储空间释放后,在第二次析构之前,这块空间又已经存放了其他数据,此时第二次析构了这块空间, 所以将原本不需要析构的空间释放掉了,因此产生了错误。

  • 深拷贝 
    必须由程序员手动定义,在自己定义的拷贝构造函数中,要为对象的成员变量申请新的存储空间,从而新旧对象虽然成员变量的值都相同,但是都指向不同的内存空间,这就是深拷贝。像个对象都要分别析构,两个内存空间不相互影响。
//自定义的拷贝构造函数
Student::Student(Student &stu){
    if(stu.name){
        (this->)name = new char[strlen(name)+1];
        strcpy(name,stu.name);//是否等价于this->name = name?
    }
}

int main(){
    Student stu1;
    stu1.setName("chai");

    //调用拷贝构造函数
    Student stu2(stu1);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

静态成员

  • 静态成员变量
//静态成员变量在类内的引用性声明
static 类型名 成员变量;
  • 1
  • 2
//静态成员变量在类的定义之外,在文件作用域的某处作正式声明,即进行初始化
类型 类名::变量名 //默认值为0
类型 类名::变量名=xxx;//给静态变量指定初始化值
  • 1
  • 2
  • 3
//静态成员变量使用的两种方法(和java一样)
//假设a是一个静态成员变量
Student stu;
stu.a;//第一种使用方法,用对象调用;

Student::a;//第二种使用方法,用类调用;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
    • 静态成员函数 
      在类内声明前加上static,在类外定义和普通的成员函数定义一样,不需要static修饰,类外的使用也有两种方法,分别是通过对象调用或通过类调用。
时间: 2024-11-07 07:14:11

转-C++快速入门的相关文章

笔记:Spring Cloud Zuul 快速入门

Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了所有其他微服务的实例信息,这样的设计非常巧妙的将服务治理体系中维护的实例信息利用起来,使得维护服务实例的工作交给了服务治理框架自动完成,而对路由规则的维护,默认会将通过以服务名作为 ContextPath 的方式来创建路由映射,也可以做一些特别的配置,对于签名校验.登录校验等在微服务架构中的冗余问题

javaweb-html快速入门

本文主要是进行HTML简单介绍(详细的属性查帮助文档就行了,这里主要为快速入门,赶时间,在最短的时间中看明白一个html文件的代码(如果能称之为代码的话)详细的样式表,布局啥的有时间再研究吧) HTML 1.html的简介 1.1,html的全称:HyperText Mark-up Language ,超文本标记型语言,是网页的语言. 超文本:比文本更加强大(后面还会讲到XML,可扩展标记性语言) 标记:就是标签,html所有操作都是通过标签直接或间接的操作(把需要操作的数据通过标签封装起来)

crosswalk 快速入门,利用WebRTC(html)开始开发视频通话

crosswalk 快速入门,利用WebRTC(html)开始开发视频通话 安装Python 从http://www.python.org/downloads/ 下载安装程序 安装完后,再添加到环境变量. 安装Oracle JDK 下载页面: http://www.oracle.com/technetwork/java/javase/downloads/ 选择要下载的Java版本(推荐Java 7). 选择一个JDK下载并接受许可协议. 一旦下载,运行安装程序. 安装Ant Ant:下载http

bash编程快速入门

首先,我们简单的介绍一下bash,bash是GNU计划编写的Unixshell,它是许多Linux平台上的内定shell,它提供了用户与系统的很好的交互,对于系统运维人员,bash的地位是举足轻重的,bash编程能很快处理日常的任务 bash入门,一个最简单的bash例子 #vim hello.sh #!/bin/bash #This is the first example of the bash #echo "Hello world" 下面,我们就这个简单的bash 脚本来介绍一下

定时器(Quartz)快速入门

Quartz概述 Quartz中的触发器 Quartz中提供了两种触发器,分别是CronTrigger和SimpleTrigger. SimpleTrigger 每 隔若干毫秒来触发纳入进度的任务.因此,对于夏令时来说,根本不需要做任何特殊的处理来"保持进度".它只是简单地保持每隔若干毫秒来触发一次,无论你的 SimpleTrigger每隔10秒触发一次还是每隔15分钟触发一次,还是每隔24小时触发一次. CronTrigger 在特定"格林日历"时刻触发纳入进程的

vue.js--60分钟快速入门

Vue.js--60分钟快速入门 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 本文摘自:http://www.cnblogs.com/keepfool/p/5619070.html 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM

Netty5快速入门及实例视频教程(整合Spring)

Netty5快速入门及实例视频教程+源码(整合Spring) https://pan.baidu.com/s/1pL8qF0J 01.传统的Socket分析02.NIO的代码分析03.对于NIO的一些疑惑04.Netty服务端HelloWorld入门05.Netty服务端入门补充06.Netty客户端入门07.如何构建一个多线程NIO系统08.Netty源码分析一09.Netty源码分析二10.Netty5服务端入门案例11.Netty5客户端入门案例12.单客户端多连接程序13.Netty学习

一起学Google Daydream VR开发,快速入门开发基础教程一:Android端开发环境配置一

原文因涉及翻墙信息,被强制删除,此文为补发! 准备工作 进入Google Daydream开发者官网,开启准备工作,官网地址:https://vr.google.com/daydream/developers/ -------------------------------------------------------------------------------------------------------------------- Google Daydream开发者网址: https

程序员带你十天快速入门Python,玩转电脑软件开发(二)

关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到熟悉的效果. 声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群538742639.群马上就满了,名额不多. 上节课主要讲解了以下内容: 为什么学习Pyth

程序员带你学习安卓开发,十天快速入门-基础知识(四)

关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到熟悉的效果. 本系列课程是.Net程序员学习安卓开发系列课程. 下面是前三次课程列表: 程序员带你学习安卓开发,十天快速入门-安卓学习必要性 程序员带你学习安卓开发,十天快速入门-开发工具配置学习 程序员带你学习安卓开发,十天快速入-对比C#学习java语法 为了大家系统有效的快速入门安卓开发,推荐