指针的引用

#include <iostream>
using namespace std; struct Teacher
{
char name[];
int age;
}; int getTeacher(Teacher **p) {
Teacher *tmp = NULL;
if (p == NULL) {
return -;
}
tmp = (Teacher *)malloc(sizeof(Teacher));
if (tmp == NULL) {
return -;
}
tmp->age = ;
*p = tmp;
} int getTeacher2(Teacher* &myp) {
myp = (Teacher *)malloc(sizeof(Teacher));
if (myp == NULL) {
return -;
}
myp->age = ;
} void FreeTeacher(Teacher *pT1) {
if (pT1 == NULL) {
return;
}
free(pT1);
} void main() {
Teacher *pT1 = NULL;
getTeacher(&pT1);
cout << "age:" << pT1->age << endl;
FreeTeacher(pT1); getTeacher2(pT1);
cout << "age:" << pT1->age << endl;
FreeTeacher(pT1);
cout << "hello..." << endl;
system("pause");
}

在C++中可以声明const引用

const Type& name = var;

const引用让变量拥有只读属性

const引用总结

1.const& int e 相当于const int * const e

2.普通引用相当于int *const e1

3.当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名

4.使用字面量对const引用初始化后,将生成一个只读变量

inline void printA() {
int a = ;
cout << "a" << a << endl;
}

编辑器将内联函数直接插入函数调用的地方,一般是常用的小函数

内联函数中不能写循环语句

结论:
1)内联函数在编译时直接将函数体插入函数调用的地方

2)inline只是一种请求,编译器不一定允许这种请求

3)内联函数省去了普通函数调用时压栈,跳转和返回的开销

#include <iostream>
using namespace std; inline int myfunc(int a, int b) {
return a < b ? a : b;
} #define MYFUNC(a,b)((a)<(b)?(a):(b)) void main() {
int a = ;
int b = ;
//int c = myfunc(++a, b); 输出结果:2;3;2
int c = MYFUNC(++a, b); //宏替换并展开 ((++a) < (b) ? (++a) : (b)) 输出结果:3;3;3
cout << "a:" << a << ";b:" << b << ";c:" << c << endl;
system("pause");
}

默认参数

#include <iostream>
using namespace std; void myPrint(int x = ) {
cout << "x:" << x << endl;
} void myPrint2(int x = , int y = ) {
cout << "x:" << endl;
} void main() {
//myPrint();
//myPrint(4);
myPrint2();
system("pause");
}

函数默认参数的规则

只有参数列表后面部分的参数才可以提供默认参数值

一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值

函数占位参数

#include <iostream>
using namespace std; void func(int a, int b, int) {
cout << "a:" << a << "b:" << b << endl;
} void main() {
//func(1, 2); 两个参数不适用
func(, , );

当函数默认参数遇上函数重载会发生什么

int func(int a, int b, int c = )
{
return a * b * c;
} int func(int a, int b)
{
return a + b;
}

存在二义性,编译不通过

//函数指针 基础的语法
//1声明一个函数类型
typedef void (myTypeFunc)(int a,int b) ; //int
//myTypeFunc *myfuncp = NULL; //定义一个函数指针 这个指针指向函数的入口地址 //声明一个函数指针类型
typedef void (*myPTypeFunc)(int a,int b) ; //声明了一个指针的数据类型
//myPTypeFunc fp = NULL; //通过 函数指针类型 定义了 一个函数指针 , //定义一个函数指针 变量
void (*myVarPFunc)(int a, int b);
// myPTypeFunc fp; //定义了一个 函数指针 变量

封装

#include <iostream>
using namespace std;
class MyCircle {
public:
double m_r;
double m_s;
public:
double getR() {
return m_r;
}
void setR(double r) {
m_r = r;
}
double getS() {
m_s = 3.14*m_r*m_r;
return m_s;
}
}; void printCircle01(MyCircle *pC) {
cout << "r:" << pC->getR() << endl;
cout << "s:" << pC->getS() << endl;
} void printCircle02(MyCircle &myc) {
cout << myc.getS() << endl;
} void printCircle03(MyCircle myc) { } void main() {
MyCircle c1, c2;
c1.setR();
cout << "c1 s:" << c1.getS() << endl; c1.setR();
printCircle01(&c1); c2.setR();
printCircle01(&c2); printCircle02(c2); system("pause");
}

lclass成员变量默认是私有的

struct成员变量默认是共有的

#pragma once  //只包含一次

相当于

#ifndef __MYTEACHER_H_  //ctrl +shift + u 变大写
#define __MYTEACHER_H_
...
#endif

这样.h文件就只会写一次到类文件中去

练习1:判断两个立方体是否相同

Cube.h

#pragma once
class Cube
{
public:
void setA(int a);
void setB(int b);
void setC(int c);
int getA();
int getB();
int getC();
void setABC(int a, int b, int c);
private:
int m_a;
int m_b;
int m_c;
int m_s;
int m_v;
public:
int judgeCube(Cube &v2);
};

Cube.cpp

#include "Cube.h"

void Cube::setA(int a) {
m_a = a;
} void Cube::setB(int b) {
m_b = b;
}
void Cube::setC(int c) {
m_c = c;
}
int Cube::getA() {
return m_a;
}
int Cube::getB() {
return m_b;
}
int Cube::getC() {
return m_c;
} void Cube::setABC(int a, int b, int c) {
m_a = a; m_b = b; m_c = c;
} int Cube::judgeCube(Cube &v2) {
if (m_a == v2.getA() && m_b == v2.getB() && m_c == v2.getC()) {
return ;
}
else {
return ;
}
}

main.cpp

#include <iostream>
using namespace std;
#include "Cube.h" void main() {
Cube v1, v2;
v1.setABC(, , );
v2.setABC(, , );
cout << v1.judgeCube(v2)<< endl;
system("pause");
}

练习2:判断点是否在圆内

Point.h

#pragma once
class Point
{
public:
int getX();
int getY();
void setPoint(int _x, int _y);
private:
int x;
int y;
};

Point.cpp

#include "Point.h"

void Point::setPoint( int _x, int _y) {
x = _x; y = _y;
}
int Point::getX() {
return x;
}
int Point::getY() {
return y;
}

Circle.h

#pragma once
#include "Point.h"
class Circle
{
public:
void setCircle(int _r, int _x, int _y);
int judge(Point &p);
private:
int r;
int x;
int y;
};

Circle.cpp

#include "Circle.h"
#include "Point.h" void Circle::setCircle(int _r, int _x, int _y) {
r = _r; x = _x; y = _y;
}
int Circle::judge(Point &p) {
int dd =(x - p.getX())*(x - p.getX()) + (y - p.getY())*(y - p.getY());
if (dd <= r*r) {
return ;
}
else {
return ;
}
}

main.cpp

#include <iostream>
using namespace std;
#include "Circle.h"
#include "Point.h" void main() {
Circle c;
Point p;
c.setCircle(, , );
p.setPoint(, );
if (c.judge(p) == ) {
cout << "点在圆内" << endl;
}
else {
cout << "点在圆外" << endl;
}
system("pause");
}

【C++】指针的引用及面向对象的更多相关文章

  1. [速记]关于指针,引用和递归和解递归——C++

    在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看 ...

  2. C++指针参数引用

    粘个代码占位置,以后有时间把指针函数,函数指针都补上 #include <iostream> using namespace std; void freePtr1(int* p1){ /* ...

  3. C/C++:提升_指针的指针和指针的引用

    C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.

  4. C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》

    C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效 ...

  5. C++学习笔记 指针与引用

    指针与引用  1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...

  6. 数组类型与sizeof与指针的引用

    以char类型为例: char a[100];     //a类型为char[100]    &a类型为 char (*)[100]    *a类型为char char *p = a;     ...

  7. c++指针与引用问题

    本来是回答问题的,到这里做个笔记 *&L是指针的引用,实参是个指针.所以L是实参指针的别名,对别名L的修改,等于对实参的修改.*L是传值,你无法改变传过来的实参指针变量的值程序代码: #inc ...

  8. C++ 中指针与引用的区别

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  9. 详解c++指针的指针和指针的引用

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方 ...

随机推荐

  1. [吴恩达机器学习笔记]12支持向量机3SVM大间距分类的数学解释

    12.支持向量机 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考资料 斯坦福大学 2014 机器学习教程中文笔记 by 黄海广 12.3 大间距分类背后的数学原理- Mathematic ...

  2. python---爬虫相关性能(各个异步模块的使用,和自定义异步IO模块)

    一:线程池,进程池等相关文章了解 python---基础知识回顾(十)进程和线程(py2中自定义线程池和py3中的线程池使用) python---基础知识回顾(十)进程和线程(协程gevent:线程在 ...

  3. 树链剖分处理+线段树解决问题 HDU 5029

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5029 题意:n个点的树,m次操作.每次操作输入L,R,V,表示在[L,R]这个区间加上V这个数字.比 ...

  4. My latest news(--2016.12.31)

    2016.12.31  前一天晚上看 “纪实新闻” ,白天看视频,晚上刷题,看电影<湄公河行动> 2016.12.30 18:36 昨天上午考完了本学期的最后一门课程,下午乒乓+值班,今天 ...

  5. 重构改善既有代码设计--重构手法15:Remove Middle Man (移除中间人)

    某个类做了过多的简单委托动作.让客户直接调用受托类. 动机:在Hide Delegate (隐藏委托关系)的“动机”中,谈到了“封装委托对象”的好处.但是这层封装也是要付出代价的,它的代价是:每当客户 ...

  6. .NET Core get started on Ubuntu 14.04

    昨天.NET Core 1.0 正式发布了,所以尝尝鲜. 根据官方介绍页面的步骤: 步骤1. sudo sh -c 'echo "deb [arch=amd64] https://apt-m ...

  7. [php]referer应用--http防盗链技术

    1.防盗链的理解 所谓防盗链是防止其他的网站引用自己网站的资源连接,比如图片.视频等等,但是并不会阻碍从自己网站上享受资源的用户,这就要求能够将其他网站的连接请求阻止 2.防盗链的原理 其实从自己网站 ...

  8. 【Codeforces752D】Santa Claus and a Palindrome [STL]

    Santa Claus and a Palindrome Time Limit: 20 Sec  Memory Limit: 512 MB Description 有k个串,串长都是n,每个串有一个a ...

  9. Bzoj2300 / 洛谷P2521 [HAOI2011]防线修建

    题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...

  10. win10本地搭建php运行环境

    一.下载搭建环境所需软件,安装顺序也要按照列表顺序安装 1.Vc2015(根据需要安装Vc2012或者Vc2015) Vc2015:https://www.microsoft.com/zh-CN/do ...