c++ 程序设计学习笔记

栏目: C++ · 发布时间: 5年前

内容简介:程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(入口地址)。我们可以将函数的入口地址赋给一个指针变量,使该变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为函数指针。实际上右移n位就相当于左操作数除以2的n次方,并且将结果往小里取整,例如:对于有符号数,如long,int,short,char类型变量,在右移时,符号位(即最高位)将一起移动,并且大多数C/C++编译器规定,如果原符号位为1,则右移时高位就补充1,原符号为0,则右移时高位

函数指针

程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(入口地址)。我们可以将函数的入口地址赋给一个指针变量,使该变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为函数指针。

#include <iostream>
#include <vector>
#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <fstream>
#include <cstddef>

void print_smaller(int a,int b)
{
    std::cout << ((a < b) ? a:b )<< std::endl;
}
int main()
{
    /*等价于 void (*fn)(int ,int ) = print_smaller;*/
    void (*fn)(int ,int );
    fn = print_smaller;
    
    fn(3,4);
    
    return 0;
}

命令行参数

#include <stdio.h>
int main(int argc,char *argv[])
{
    for(int i = 0;i < argc;i++)
        printf("%s\n",argv[i]);

    return 0;
}

命令行参数这部分有个知识点就是说如果参数中带有空格,可以使用双引号括起来。

例如./example hello world "hello world" 程序输出
./example
hello
world
hello world

右移运算符

实际上右移n位就相当于左操作数除以2的n次方,并且将结果往小里取整,例如:

-25 >> 4 = -2
-2 >> 4 = -1
18 >> 4 = 1

对于有符号数,如long,int,short,char类型变量,在右移时,符号位(即最高位)将一起移动,并且大多数C/C++编译器规定,如果原符号位为1,则右移时高位就补充1,原符号为0,则右移时高位就补充0。

引用作为函数的返回值

int n = 4;
int & SetVaule(){return n;}

int main()
{
    SetValue() = 40;
    cout << n;
    return 0;
}//输出40

常引用

不能通过常引用去修改其引用的内容。

int n = 100;
const int & r = n;
r = 200;//编译报错
n = 300;//没问题,不能通过常引用去修改其引用的内容,但没有限制通过其它方式修改n的内容

常量指针

不能把常量指针赋值给非常量指针。

可以把非常量指针赋值给常量指针。

原因如下:

定义常量指针的初衷是不能通过常量指针修改其指向的内容。如果把常量指针赋值给非常量指针,就可以通过非常量指针修改常量指针指向的内容。

函数参数为常量指针时,可避免函数内部不小心改变参数指针所指地方的内容

void MyPrintf(const char *p)
{
    //strcpy函数原形第一个参数为char*,由于不能将常量指针赋值给非常量指针,因此编译报错
    strcpy(p,"this");//编译出错
    printf("%s",p);
}

用new运算符实现动态内存分配

new T;

new T[n];

这两个表达式返回值的类型都是T*

内联函数

函数调用是有开销的。如果函数本身只有几条语句,执行非常快,而且函数被反复执行很多次,相比之下调用函数所产生的这个开销就会显得比较大。

为了减少函数调用的开销,引入了内联函数机制。编译器处理对内联函数的调用语句时,是将整个函数的代码插入到调用语句处,而不会产生调用函数的语句。

在函数定义前面加inline关键字,即可定义内联函数。

函数重载

一个或多个函数,名字相同,然而参数个数或者参数类型不相同,这叫做函数的重载。函数名字相同,参数相同,仅返回值不同,不是函数重载,而是重复定义。

好处:函数重载使得函数命名变得简单。

编译器根据调用语句中的实参的个数和类型判断应该调用哪个函数。

函数缺省参数

C++中定义函数的时候可以让最右边的连续若干个参数有缺省值,那么调用函数的时候,若相应位置不写参数,参数就是缺省值。

函数参数可缺省的目的在于提高程序的可扩充性。

如果某个写好的函数要添加新的参数,而原先那些调用该函数的语句,未必需要使用新增的参数,那么为了避免对原先那些函数调用语句的修改,就可以使用缺省参数。

对象的内存分配

对象的内存空间

对象的大小=所有成员变量的大小之和

一个对象的某个成员变量被改变,不会影响到其他的对象。

对象之间可以用=进行赋值,不能使用
== != > < >= <=

进行比较,除非这些运算符经过了重载。

#include <iostream>

using namespace std;

class CRectangle{
public:
    int w;
    
    int h;
    
    void Init(int w_,int h_);
    
    int Area();
    
    int Perimeter();
};

void  CRectangle::Init(int w_,int h_){
        w = w_;
        h = h_;
    }

int CRectangle::Area(){
        return w*h;
    }

int CRectangle::Perimeter(){
        return 2*(w + h);
    }

int main()
{
    int w,h;
    
    CRectangle r;
    
    cin>>w>>h;
    
    r.Init(w,h);
    
    cout<<r.Area()<<endl<<r.Perimeter()<<endl;
    return 0;
}

类成员的可访问范围

关键字--类成员可被访问的范围

private:指定私有成员,只能在成员函数内被访问,设置私有成员的目的是强制对成员变量的的访问一定要通过成员函数进行。

public:指定公有成员,可以在任何地方被访问

protected:指定保护成员

三种关键字出现的次数和先后顺序都没有限制

缺省为私有成员

例如:
class Man{
    int nAge;//私有成员
    char szName[20];//私有成员
public:
    void SetName(char *Name){
        strcpy(szName,Name);
    }
};

内联函数

定义方法:

inline + 成员函数

整个函数体出现在类定义内部

例如:
class B{
    inline void func1();
    void func2()
    {    
    }
};
void B::func2()
{
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python 3网络爬虫开发实战

Python 3网络爬虫开发实战

崔庆才 / 人民邮电出版社 / 2018-4 / 99

本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib、requests、正则表达式、Beautiful Soup、XPath、pyquery、数据存储、Ajax数据爬取等内容,接着通过多个案例介绍了不同场景下如何实现数据爬取,后介绍了pyspider框架、Scrapy框架和分布式爬虫。 本书适合Python程序员阅读。一起来看看 《Python 3网络爬虫开发实战》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具