一、结构体和类(class)

下面一个使用结构体类型的例子

 #include <iostream>
using namespace std;
struct Point{ // 声明Point结构体类型
double x; // 成员变量,没有使用private和public时系统默认为公有类型成员变量
double y;
};
int main()
{
Point p; // 定义的p在c里称为结构体变量
p.x = 3.2; // 因为x是公有类型可以通过结构体变量直接引用使用
p.y = 8.9;
cout << "(" << p.x << "," << p.y << ")" << endl; // 结构体的使用
return ;
}

类是面向对象语言的重要特征,下面是一个使用类的例子

 #include <iostream>
using namespace std;
class Point // 类
{private:       //私有数据成员不能在类外普通函数中直接引用使用
double x; // 私有成员变量
double y; // 私有成员变量
public:        //公有数据成员或成员函数可以在类外普通函数中直接引用使用,结构体中默认所有成员都是公有的。
setPoint(double m, double n) // 公有成员函数
{ x = m; y = n; // 私有成员变量x y 在同为成员的函数中出现
} // 并且此时不需要"."作为成员连接符 因为x y 和函数setPoint 都在Point类“内部”
printPoint() // 公有成员函数
{ cout << "(" << x << "," << y << ")" << endl; } // 同上
};
//如果类外定义printPoint(),则函数开头为:void Point::printPoint()
int main()
{
Point p; //定义的p在c++里称为对象
p.setPoint(3.2, 8.9);
// 因为x是在类里声明为privete私有类型,在这里x不能像p.x直接引用使用,而是直接供成员函数使用
p.printPoint();
return ;
}//上面类的使用方法同样适用于c++里的结构体

c++里扩展了结构体的功能,使结构体也具有类的几乎所有特点,如可以包含成员函数,构造函数等等。类与结构体的区别在于:在默认状态下(即在不声明private和public时),结构的所有成员均是公有的,而类的所有成员是私有的,公有的可以在其它函数中直接调用成员变量。

在c++里之所以要保留struct,是为了与C兼容,让c程序可以不加修改地在c++环境下使用。

因为我们学习的算法可以只使用结构体就可以了,所以可以在参考书中当成类来看,但是类的继承派生等没有用在我们目前学习的算法里。

二、this指针

它是指向本类对象(或体结构体变量)的指针,它的值是当前被调用的成员函数所在的对象的起始地址。*this就是this所指向的结构体变量。return *this //返回当前结构体变量值

三、引用和指针

int a,c;

int &b=a; //类似指针,与指针不同点如int &b=a;&b=c;则错,因为只能引用一次。

声明b是a的引用 ,即b是a的别名。在声明一个引用类型变量时,必须同时使之初始化即声明它代表哪个变量。在声明变量 b 是变量 a 的引用后,在它们所在函数执行期间,该引用类型变量 b 始终与变量a相联系,不能再做为其它变量的引用。常用在函数形参中,常在形参前面加const表示在该函数体内不能修改。

四、运算符重载实际上是函数的重载

C++中预定义的运算符(如>>,+,<,)的操作对象只能是基本数据类型(如:int,float),实际上,对于很多用户自定义类型(如:结构体)要进行类似的运算操作时需要重载(=和&有时可不重载)。

运算符重载的格式如下:

函数类型 operator 运算符名称(形参表列){对运算符的重载处理}

赋值等运算符必须定义为类(或结构体,本文提到的类与结构体等同,对象与结构体变量等同)的成员函数(即放在类里),<<和>>不能定义为类的成员函数(即需放在类外)。

对“<<”和“>>”重载的函数形式如下:

 //cin和cout分别是istream和ostream类的对象
istream & operator >> (istream &,自定义类 &)
ostream & operator << (ostream &,自定义类 &)

下面例子重载+、>>和<<运算符

 #include<iostream>
using namespace std;
struct Complex
{
 double real,imag;
 Complex(double r=,double i=)  {   real=r;   imag=i;  }
 Complex operator + (Complex &c2);//声明运算符的"+"函数
  void display();
};
Complex Complex::operator+(Complex &c2) //在结构体外定义结构体的成员函数用::
{
 Complex c;
 c.real=real+c2.real;
 c.imag=imag+c2.imag;
 return c;
} void Complex::display()
{ cout<<"("<<real<<","<<imag<<"i)"<<endl;} istream & operator >>(istream & input,Complex &c) //重载>>运算符用于输入数据,因结构体里变量是公有成员,不用声明为友元函数,可直接引用成员
{input>>c.real>>c.imag; return input;} ostream & operator <<(ostream & output,Complex &c) //重载<<运算符用于输出数据
{output<<"("<<c.real<<"+"<<c.imag<<"i)"; return output;} int main()
{
 Complex c1(,),c2(,-),c3;
 c3=c1+c2;
 cout<<"c1=";
 c1.display();
 cout<<"c2=";
 c2.display();
cout<<c3; //和 c3.display();等价
  return ;
}

从C过渡到C++的几个知识点(结构体、引用、重载运算符)的更多相关文章

  1. 【原】Dubbo 多版本号过渡

    之前发过一篇因为接口规范的问题导致其它端出现服务不可用的文章(http://www.cnblogs.com/zdd-java/p/8612763.html),然而最近在查阅了dubbo官方指南文档才知 ...

  2. clang_intprt_t类型探究

    作者:玄魂工作室-钱海龙 问题 这篇手把手教你构建 C 语言编译器,里面有着这样的代码 void eval() { int op, *tmp; while (1) { if (op == IMM) { ...

  3. 【译】Unity3D Shader 新手教程(4/6) —— 卡通shader(入门版)

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 暗黑系 动机 如果你满足以下条件,我建议你阅读这篇教程: 你想了解更多有关表面着色器的细节知识. 你想实现一个入门 ...

  4. thinkphp如何一次性的上传多个文件,在文件域中可以多选?

    可以做到类似于某度网盘的样式吗? 文件夹的命名, 可以用单数, 也可以用复数, 在同一个项目中, 只要统一就好了. 毕竟项目开发不同于英语写作. 建议使用缩写, 不管是不是缩写都用单数, 这样简洁,容 ...

  5. iOS开发CoreGraphics核心图形框架之一——CGPath的应用

    一.引言    CoreGraphics核心图形框架相较于UIKit框架更加偏于底层.在Objective-C工程中,CoreGraphics其中方法都是采用C语言风格进行编写的,同时其并不支持Obj ...

  6. 我所理解的Cocos2d-x

    我所理解的Cocos2d-x(完全基于Cocos2d-x3.0,深度剖析计算机图形学,OpenGL ES及游戏引擎架构,全面提升游戏开发相关知识) 秦春林 著   ISBN 978-7-121-246 ...

  7. Cesium原理篇:6 Render模块(6: Instance实例化)

    最近研究Cesium的实例化,尽管该技术需要在WebGL2.0,也就是OpenGL ES3.0才支持.调试源码的时候眼前一亮,发现VAO和glDrawBuffers都不是WebGL1.0的标准函数,都 ...

  8. 可扩展的事件复用技术:epoll和kqueue

    通常来说我喜欢Linux更甚于BSD系统,但是我真的想在Linux上拥有BSD的kqueue功能. 什么是事件复用技术 假设你有一个简单的web服务器,并且那里已经打开了两个socket连接.当服务器 ...

  9. iOS 2D绘图 (Quartz2D)之阴影和渐变(shadow,Gradient)

    原博地址:http://blog.csdn.net/hello_hwc/article/details/49507881 Shadow Shadow(阴影) 的目的是为了使UI更有立体感,如图 sha ...

随机推荐

  1. SQLServer如果查询表相关的视图以及存储过程

    最近在维护一个电商平台,需要对订单表增加字段,但是在review代码的时候发现这个平台的代码写的很有提升价值,且大量的使用了识图和存储过程,所以也给刚接触这个平台的萌新,也就是瓦,造成了不小的困扰,毕 ...

  2. mingw-gcc-9.0.1-i686-posix-sjlj-201903

    -------------------------------------------------------------------------------gcc version 9.0.1 201 ...

  3. C++11 double转化为string

    C++11转化double为string是一件很容易的事情. 方法: 1:使用C中的sprintf函数,这里就不说了. 2:使用std::ostringstream.这个与std::cout是一样的. ...

  4. LeetCode 21. Merge Two Sorted Lists(c++)

    要定义两个链表 判断时依次对应每一个链表的值进行判断即可. /** * Definition for singly-linked list. * struct ListNode { * int val ...

  5. tomcat启动后产生的日志

    产生的日志  相当于 定时选取webapps里面搜索有没有超时的session,然后将超时的session关掉. 每一个webapp 都是独立的 一个application对应一个context,se ...

  6. Python数据可视化-seaborn库之countplot

    在Python数据可视化中,seaborn较好的提供了图形的一些可视化功效. seaborn官方文档见链接:http://seaborn.pydata.org/api.html countplot是s ...

  7. AI阅粒app

    项目架构 前端 lve 后端 php+flask 实现的功能 在app底栏上有首页,标签,评论,和我的.能够通过首页浏览文章,通过标签查看对应的文章,每个标签里边的文章底下都有对应的评论数,浏览人数, ...

  8. ThoughtWorks的面试总结

    今天有幸到ThoughtWorks去面试.我觉得自己的能力与他们的需要有些距离(还不知道面试结果如何). 逻辑测试部分,不是很难,是语言问题.几乎用了1个小时去理解一句表达.在Pair Program ...

  9. windows下安装Python虚拟环境virtualenvwrapper-win

      1 前言 由于Python的版本众多,还有Python2和Python3的争论,因此有些软件包或第三方库就容易出现版本不兼容的问题. 通过 virtualenv 这个工具,就可以构建一系列 虚拟的 ...

  10. vmware 虚拟机报错 删除文件夹,可以恢复