【C/C++学院】(4)c++开篇/类和对象/命名空间/类型增强/三目运算符/const专题/引用专题/函数增强

1.类和对象

成员函数,成员变量,抽象封装的能力。

求圆的面积;

#include <iostream>
using namespace std;
class circle{
private:
    double m_r;//成员变量
public:
    void setR(double r)//成员函数
    {
        m_r = r;
    }
    double getR()
    {
        return m_r;
    }
    double getS()
    {
        return 3.14*m_r*m_r;
    }
};
void main()
{
    circle c1;
    c1.setR(4);
    cout << "r:" << c1.getR() << "s:" << c1.getS() << endl;
    c1.setR(5);
    cout << "r:" << c1.getR() << "s:" << c1.getS() << endl;
    system("pause");
}

2.命令空间

命名空间;c++对c的扩展。解决标识符冲突。

std::out  :: 域作用符。

#include <iostream>
namespace NameSpaceA{
    int a = 0;
}
namespace NameSpaceB{
    int a = 1;
    namespace NameSpaceC{
        struct Teacher{
            char name[10];
            int age;
        };
    }
}
void main()
{
    using namespace NameSpaceA;
    printf("NameSpaceA:a=%d\n", a);
    printf("NameSpaceB:a=%d\n", NameSpaceB::a);
    using NameSpaceB::NameSpaceC::Teacher;
    Teacher t1 = { "aaa", 3 };
    printf("t1.name = %s\n", t1.name);
    printf("t1.age = %d\n", t1.age);
    system("pause");
} 

3.语法增强

3.1register关键字增强 

int main()

{

    register int a = 0;

    printf("&a = %x\n", &a);

    system("pause");

    return 0;


//register关键字 请求编译器让变量a直接放在寄存器里面,速度快

//在c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容

register关键字的变化

register关键字请求“编译器”将局部变量存储于寄存器中

C语言中无法取得register变量地址

在C++中依然支持register关键字

C++编译器有自己的优化方式,不使用register也可能做优化

C++中可以取得register变量的地址 

3.2struct类型增强


struct类型的加强:

C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型

C++中的struct是一个新类型的定义声明


struct Student

{

    char name[100];

    int age;

};

 

int main(int argc, char *argv[])

{

    Student s1 = {"wang", 1};//struct Student s1={};

    Student s2 = {"wang2", 2};    

    return 0;

}

4.三目运算符

#include <iostream>
using namespace std;

//在c++里面的三目运算符 返回是一个变量
//让表达式做左值
//1 左值 能被放在 = 做值 称为左值
//2 当左值的条件, 这段内存空间可以被你写

int main()
{
	int a = 10;
	int b = 20;
	int c = 31;

	//返回一个最小数 并且给最小数赋值成30
	//三目运算符是一个表达式 ,表达式不可能做左值
	//让表达式做左值
	(a < b ? a : b) = 30;//相当于c中的*((a < b ? &a : &b)) = 30;
	//在c中编译不过,报错
	printf("a = %d, b = %d\n", a, b);

	system("pause");

	return 0;
}

5.const专题

const 定义的变量, 在c++的编译器中, 做了一个符号表, key <--->value | a<-->10;

修改的时候, 只是修改了重新分配的空间, 对原来的const数据没有造成修改。

而在c中,却可以将const常量进行修改。

6.引用专题

    引用在c++内部是一个常量指针。

type &name <---> type * const name;

引用的本质是c++编译器帮我们做了一个取地址的操作。

#include <iostream>
using namespace std;

void swap(int &a, int &b)
{
	int c = 0;
	c = a;
	a = b;
	b = c;
}

void swap2(int *a, int *b)
{
	int c = 0;
	c = *a;
	*a = *b;
	*b = c;
}
//引用和左值进行绑定的时候
void main()
{
	int a1 = 10; int b1 = 20;
	swap(a1, b1);
	printf("a1:%d, b1:%d", a1, b1);
	system("pause");
}

7.函数增强

7.1内联函数

内联函数的函数体需要和实现写在一起,不能单独声明。

代替带参数的宏,避免宏的副作用。

#include "iostream"
using namespace std;

#define MYFUNC(a, b) ((a) < (b) ? (a) : (b))
//inline请求关键字, 内联编译
//内联函数的函数体,需要和实现写在一块
inline int myfunc(int a, int b)
{
	return a < b ? a : b;
}

int main()
{
	int a = 1;
	int b = 3;
	//int c = myfunc(++a, b);
	int c = MYFUNC(++a, b);//===> ((++a) < (b) ? (++a) : (b));

	printf("a = %d\n", a); //3
	printf("b = %d\n", b);//3
	printf("c = %d\n", c); //3

	system("pause");
	return 0;
}

7.2函数重载

函数重载与函数指针的结合;可以添加断电,选择逐语句执行,观察运行效果。

#include "iostream"
using namespace std;

int func(int x) // int(int a)
{
	return x;
}

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

int func(const char* s)
{
	return strlen(s);
}

//定义了一个  指针  类型 (指向函数的指针类型)
typedef int(*PFUNC)(int a); // int(int a)

void main()
{
	PFUNC p = func;
	int c = p(1);

	printf("c = %d\n", c);
	system("pause");
}
时间: 2025-01-30 13:58:11

【C/C++学院】(4)c++开篇/类和对象/命名空间/类型增强/三目运算符/const专题/引用专题/函数增强的相关文章

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

java private-java 一个类的对象访问私有属性的问题

问题描述 java 一个类的对象访问私有属性的问题 public class ModifierTest1 { public static void main( String[] args ) { A a = new A(); //System.out.println(a.s); a.f(); } } class A { private int i; private String s; public A() { i = 123; s = "hello"; } public void f(

Python中的类与对象之描述符详解

 这篇文章主要介绍了Python中的描述符详解,属于Python学习过程中类与对象的基本知识,需要的朋友可以参考下     描述符(Descriptors)是Python语言中一个深奥但却重要的一部分.它们广泛应用于Python语言的内核,熟练掌握描述符将会为Python程序员的工具箱添加一个额外的技巧.为了给接下来对描述符的讨论做一些铺垫,我将描述一些程序员可能会在日常编程活动中遇到的场景,然后我将解释描述符是什么,以及它们如何为这些场景提供优雅的解决方案.在这篇总结中,我会使用新样式类来指代

PHP的类与对象

自 PHP 5 起完全重写了对象模型以得到更佳性能和更多特性.这是自 PHP 4 以来的最大变化.PHP 5 具有完整的对象模型.  PHP 5 中的新特性包括访问控制,抽象类和 final 类与方法,附加的魔术方法,接口,对象复制和类型约束.  PHP 对待对象的方式与引用和句柄相同,即每个变量都持有对象的引用,而不是整个对象的拷贝.   属性: 类的变量成员叫做属性 属性声明关键字可以是public protected private 属性中的变量是可以初始化的但初始话必须是常数不能是计算式

PHP面向对象编程详解:类和对象

PHP面向对象编程详解:类和对象 从OOP的视角看,不应区分语言.无论是C++.无论是Java.无论是.net还有更多面向对象的语言,只要你了解了OO的真谛,便可以跨越语言,让你的思想轻松的跳跃.便没有对于Java..net.PHP 之间谁强谁弱的争执了. 希望这个介绍PHP5面向对象编程(OOP)的资料能让初学者受益,能让更多的PHPer开始转向OO的编程过程. 相对PHP4,PHP5在面向对象方面改变了很多.我们将只介绍PHP5环境下的面向对象.而我们必须改变自己来跟随PHP5的发展.如果代

PHP类和对象函数实例详解

1. interface_exists.class_exists.method_exists和property_exists:         顾名思义,从以上几个函数的命名便可以猜出几分他们的功能.我想这也是我随着对PHP的深入学习而越来越喜欢这门编程语言的原因了吧.下面先给出他们的原型声明和简短说明,更多的还是直接看例子代码吧. bool interface_exists (string $interface_name [, bool $autoload = true ]) 判断接口是否存在

C#体验编程技术 类与对象

编程|对象 组件编程不是对传统面向对象的抛弃,相反组件编程正是面向对象编程的深化和发展.类作为面向对象的灵魂在C#语言里有着相当广泛深入的应用,很多非常"Sharp"的组件特性甚至都是直接由类包装而成.对类的深度掌握自然是我们"Sharp XP"重要的一环. 类 C#的类是一种对包括数据成员,函数成员和嵌套类型进行封装的数据结构.其中数据成员可以是常量,域.函数成员可以是方法,属性,索引器,事件,操作符,实例构建器,静态构建器,析构器.我们将在"第五讲 构

php的类和对象(翻译:midiguy)

对象 /**********************************************************翻译:midiguy 翻译错误之处还请各位指出E-Mail:midiguy@263.netQQ:5149927***********************************************************/ 面向对象程序设计的来源得自于人们看待电话.汽车这些物体的想法.很多程序设计者在讨论面向对象程序设计的时候喜欢用"包装"或者"

初学Java入门--类与对象

初学|对象 4.2 类与对象 4.2.1 类 在面向对象的语言中,类是个很重要的概念.面向对象的方法把所有的处理对象进行归类.具有相同性质的对象归为一类.例如学校里有很多学生,每个学生都是一个对象,而"学生"则是一个类,它包含了所有在学校学习的人. 在Java语言里,对象是一组描述对象的属性和操作方法的集合,其中属性表明对象的状态,方法表明对象的行为.类是对象的定义.一个对象具有哪些属性和方法,由类来决定.从编程角度看,类是一种复合数据类型,它封装了一组变量和方法(函数). 声明一个类