C++ 拾遗

一、c++两个基本的运算符:&(取址运算符)*(间接访问运算符/解引用指针)

首先是&运算符:当它后面跟一个变量名的时候,给出这个变量名的地址.

#include <iostream>
using namespace std;
int main()
{
  int a=5,b=6,c=7,d=8;
  double e=3.1415;
  //单独赋值,并且*和p_a紧挨着
  int *p_a=&a;
  //多个赋值(既有指针,又有普通变量)
  int * p_b=&b,* p_c=&c,*p_d=&d,temp=100;

  //单独赋值,double类型
  double * p_e=&e;
}

二、指针和引用的定义和性质区别:

(1)指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

(2)可以有const指针,但是没有const引用;

(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;

(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。

(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;

(7)指针和引用的自增(++)运算意义不一样;

三、C++中,struct关键字与Class关键字基本是一样的,但是,有两点不同

  1  struct定义的数据类型里面所有成员默认级别都是共有的,而class里面所有成员默认级别都是私有的
  2 在模板定义中,只能用class 或者typename  而不能用struct

结构体可以看做是一种自定义的数据类型,它还有一个很重要的特性,就是结构体可以相互嵌套使用,但也是有条件的,结构体可以包含结构体指针,但绝对不能在结构体中包含结构体变量。

(1) 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct。

(2) 在表示数据量大、逻辑复杂的大对象时,首选class。

(3) 在表现抽象和多级别的对象层次时,class是最佳选择 

 
四、c++类对象作为函数参数,结构体类同,只是结构体不用实现构造函数

在使用对象作为参数时,有以下几种方法:

void func(Cobject* object);

void func(Cobect& object);

void func(Cobject object);

有什么区别呢?

1:void func(Cobject* object);

这种方式是将类指针作为参数,函数压入参数时实际上复制了指针的值(其实指针可以看作一个存放地址值的整形),实际复制的指针仍指向原对象的空间,所以func函数对该指针的操作是对原对象空间的操作。

2:void func(Cobject& object);

这种方式和传指针类似,但函数压入参数时实际上复制了object对象的this指针,其实this指针不是一个真正存在的指针,可以看作是每个对象的数据空间起始地址。func函数中对this指针的操作,实际上也是对原对象空间的操作。

3:void func(Cobject object);

这种函数是非常不建议的,因为函数参数压栈时,对object进行了复制(还记得拷贝构造函数吗),所以函数对object的操作实际上是对新的对象空间进行的操作,不会影响原对象空间。由于不必要的拷贝对象是十分浪费时间的,也没有意义,我们完全可以用函数func(const Cobject& object);来代替,同样能保护对象的只读性质。

不管值传递,引用传递啊乱七八遭的什么东西,反正调用函数时都是会复制参数的,只是不同的是复制的是地址,还是整个对象空间的区别而已。

相同的,函数Cobject func(Cobject& object);在return Cobject对象时,同样会进行构贝构造。这些隐藏的对象复制都是不需要的,我们可以改为Cobject&func(Cobject& object);或是

Cobject* func(Cobject& object);这样,在return时,就只是对指针(地址)的复制而已

在不是特殊的情况下,不要将整个对象作为参数,也不要返回整个对象。

为类声明一个private的拷贝构造函数,可以防止声明类似的函数,它们都不会通过编译。

四、类对象的赋值和创建

     1.对象的赋值只对其中的数据成员赋值,而不能对成员函数赋值。赋值的过程是将一个对象的数据成员在存储空间的状态复制给另一个对象的数据成员的存储空间。

     2.类的数据成员中不可包括动态分配的数据,否则在赋值时可能出现严重的后果。

C++在创建对象的时候可以采用两种方式:(例如类名为Test) Test test  或者 Test* pTest = new Test()。

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;


class aa
{
public:
    int b;
    int c;
    
    aa(){}
    ~aa(){}
};
class bb
{
public:
    aa *ga;//如果是aa ga
    void fdds(aa & fa)
    {

        ga =&fa;//如果是类变量aa ga,则只是浅copy一份当前的fa给ga,输出的值不会是5和9
        fa.b = 5;
        fa.c = 9;
        cout << ga->b << endl;
        cout << ga->c << endl;
        
    }
    
};
int _tmain(int argc, _TCHAR* argv[])
{
    
    aa *ha = new  aa();
    ha->b = 1;
    ha->c = 2;
    bb *hb = new  bb();
    hb->fdds(*ha);
    
    return 0;
}
原文地址:https://www.cnblogs.com/bile/p/8175950.html